SkyN
SkyN

Reputation: 1533

How load/save/update child collection from model with Entity framework?

I wont load and upset list of parameters with Entity framework. I try many variants, but get exceptions on all its. How realize GetParamValue and SetParamValue method of model?

namespace PoliteBot.Models
{
public class Param
{
    public long ParamID { get; set; }
    public virtual ChatUser ChatUser { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }
}
public class ChatUser
{
    public int ChatUserID { get; set; }
    public virtual ICollection<Param> Params { get; set; }
    public string GetParamValue(string paramName, ApplicationDbContext db)
    {
        return db.Params.FirstOrDefault(p => p.Name == paramName && p.ChatUser.ChatUserID == ChatUserID)?.Value;
    }
    public void SetParamValue(string paramName, string paramVal, ApplicationDbContext db)
    {
        var result = db.Params.FirstOrDefault(p => p.Name == paramName && p.ChatUser.ChatUserID == ChatUserID);
        if (result == null)
            db.Params.Add(new Param { Name = paramName, Value = paramVal, ChatUser = this });
        else
            result.Value = paramVal;
        db.SaveChanges();
    }
}
}

Upvotes: 2

Views: 93

Answers (2)

You don't have access to the database inside the model. Try this

  class Program
{
    static void Main(string[] args)
    {
        using (var db = new ApplicationDbContext())
        {
            Temp ch = new Temp();

            ch.SetParamValue("test", "test", db);
            ch.GetParamValue("test",db);
        }
    }
}


public class ApplicationDbContext : DbContext
{
    public DbSet<Param> Params { get; set; }
    public DbSet<ChatUser> ChatUsers { get; set; }
}


public class Param
{
    public long ParamID { get; set; }
    public virtual ChatUser ChatUser { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }
}
public class ChatUser
{
    public int ChatUserID { get; set; }
    public virtual ICollection<Param> Params { get; set; }

}
public class Temp
{
    public string GetParamValue(string paramName, ApplicationDbContext db)
    {
        return db.Params.FirstOrDefault(p => p.Name == paramName && p.ChatUser.ChatUserID == 1).Value;
    }
    public void SetParamValue(string paramName, string paramVal, ApplicationDbContext db)
    {
        var result = db.Params.FirstOrDefault(p => p.Name == paramName && p.ChatUser.ChatUserID == 1);
        if (result == null)
            db.Params.Add(new Param { Name = paramName, Value = paramVal, ChatUser = new ChatUser {ChatUserID=1 } });
        else
            result.Value = paramVal;
        db.SaveChanges();
    }
}

} This works for me

Upvotes: 0

Steve Greene
Steve Greene

Reputation: 12304

You need to separate your concerns - don't do your database access inside your models. Keep them POCO and perform the database actions inside your actions or methods:

var chatUser = db.ChatUsers.Include(cu => cu.Params).First(cu => cu.ChatUserId == id);

Now you can work with the collection of params:

var param = chatUser.Params.FirstOrDefault(p => p.Name == paramName);
param.Value = paramVal;
db.SaveChanges();

Upvotes: 1

Related Questions