gog
gog

Reputation: 12988

How to deal with custom Properties in EF?

In my app, i have a edmx file with some partial classes representing my tables, and a context class wich i have the methods i need i.e GetMessages() and GetMessageById(long idMessage). In that case, i use the GetMessages() method to fill a grid. Everything normal.

The Message entity class is something like this:

[Table("Message")]
public partial class Message
{
    public long IdMessage{get;set;}
    public long IdStatus{get;set;}
}

The problem is that i have another table that i have the StatusDescription that i need to get using the IdStatus.

I created another partial class with this property:

public partial class Message
{
    private static readonly MessageRepository MessageRepository ;
      static Message()
    {
        MessageRepository = new MessageRepository();
    }
    public string StatusDescription
    {
        get { return  MessageRepository .GetMessageDescription(this.Cd_SchedulerStatus); }
    }
}

And the method in the MessageRepository:

    public MessageRepository()
    {
        _appContext= AppContext.GetContext();
    }


    public string GetMessageStatusDescription(int statusId)
    {
        var status = _appContext.Message.FirstOrDefault(id => id.IdStatus.Equals(statusId));
        return status != null ? status.StatusDescription : string.Empty;
    }

I know that it generates problems and it is not the best approach to deal with it, because im acessing the data inside the entity class, im having the n+1 problem, each time i send a new query to the database.

I would like to know if somebody have this problem and whats the best solution?

Upvotes: 0

Views: 51

Answers (1)

qujck
qujck

Reputation: 14580

I suggest you create a new context for each message description request:

public string GetMessageStatusDescription(int statusId)
{
    using (var appContext = AppContext.GetContext())
    {
        var status = appContext.Message.FirstOrDefault(id => id.IdStatus == statusId);
        return status != null ? status.StatusDescription : string.Empty;
    }
}

Upvotes: 3

Related Questions