C# 实体框架不';t将数据库上下文中仍然存在的对象与从不同类引用的相同对象相关联
我正在尝试将C# 实体框架不';t将数据库上下文中仍然存在的对象与从不同类引用的相同对象相关联,c#,entity-framework,C#,Entity Framework,我正在尝试将消息添加到我的数据库 Message.cs: public class Message { public int Id { get; set; } public int SenderId { get; set; } public virtual User Sender { get; set; } public virtual Collection<Recipient> Recipients { get; set; } pub
消息添加到我的数据库
Message.cs:
public class Message
{
public int Id { get; set; }
public int SenderId { get; set; }
public virtual User Sender { get; set; }
public virtual Collection<Recipient> Recipients { get; set; }
public MessageTrigger Trigger { get; set; }
public string Body { get; set; }
public DateTime CreatedTs { get; set; }
}
如您所见,两个表都将其外键设置为用户Id
User.cs:
现在,在向数据库添加新消息时
public void Add(Message message)
{
using (var ctx = new ShowcaseContext())
{
foreach (var reci in message.Recipients)
{
ctx.Users.Attach(reci.User);
}
ctx.Messages.Add(message);
ctx.SaveChanges();
}
}
我必须将所有用户附加到上下文中,因为如果没有,EF将再次将用户添加到数据库中。
当消息
没有发送者时,这一切正常。现在,在添加发送方和SenderId
属性之后
对于消息
类,EF将用户
再次添加到用户表中。所以我试过这样的方法:
public void Add(Message message)
{
using (var ctx = new ShowcaseContext())
{
foreach (var reci in message.Recipients)
{
ctx.Users.Attach(reci.User);
}
ctx.Users.Attach(message.Sender); // Here the error is thrown
ctx.Messages.Add(message);
ctx.SaveChanges();
}
}
但随后出现了以下错误:
附加实体类型的实体时出错。用户,
因为相同类型的另一个实体已经具有相同的主键值
因此,sender
的用户已经在数据库上下文中,但是上下文似乎没有将此用户与sender的用户相关联
因此,sender
的userobject作为副本添加到数据库中
有人知道这个问题的解决方案吗?
我只想在数据库中添加一条消息
,而不想在用户表中再次添加一个已经存在的用户。我已经解决了这个问题:
public void Add(Message message)
{
using (var ctx = new ShowcaseContext())
{
foreach (var reci in message.Recipients)
{
ctx.Users.Attach(reci.User);
}
ctx.Messages.Add(message);
ctx.Entry(message.Sender).State = EntityState.Detached;
ctx.SaveChanges();
}
}
将消息添加到上下文后,我显式地将发送者
用户对象与上下文分离。
我想这不是最好的解决办法,但我能想到的唯一可行的办法
public void Add(Message message)
{
using (var ctx = new ShowcaseContext())
{
foreach (var reci in message.Recipients)
{
ctx.Users.Attach(reci.User);
}
ctx.Users.Attach(message.Sender); // Here the error is thrown
ctx.Messages.Add(message);
ctx.SaveChanges();
}
}
public void Add(Message message)
{
using (var ctx = new ShowcaseContext())
{
foreach (var reci in message.Recipients)
{
ctx.Users.Attach(reci.User);
}
ctx.Messages.Add(message);
ctx.Entry(message.Sender).State = EntityState.Detached;
ctx.SaveChanges();
}
}