Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架不';t将数据库上下文中仍然存在的对象与从不同类引用的相同对象相关联_C#_Entity Framework - Fatal编程技术网

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