Reputation: 1533
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
Reputation: 336
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
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