简体   繁体   中英

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();
    }
}
}

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();

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM