2

这是不言自明的。我有一个包含另一个的类让我们称它们为主题和教室

public class Subject
{
   public Classroom Class {get; set;}
}

我正在使用无状态外观,这意味着我的 DbContext 在恢复对象后立即被处理,并被创建用于存储新对象。它不应该知道 Classroom 不是一个新对象,因为它的 ID 已经在数据库中了吗?使用调试器,我可以在调用 SaveChanges 方法之前跟踪到该点,而 Classroom.id 是我在数据库中拥有的那个。有什么问题?EF 添加了一个新的 Classroom,其属性与之前的完全相同,但有一个新的 PK。我在这里做错了什么?

这是用于一般 CRUD 操作的代码(它们在我的 DbContext 中)更新和删除都可以正常工作:

    public void Update(DbSet MySet, object Obj)
    {
        MySet.Attach(Obj);
        var Entry = this.Entry(Obj);
        Entry.State = EntityState.Modified;
        this.SaveChanges();
    }


    public void Insert(DbSet MySet, object Obj)
    {
        MySet.Add(Obj);
        this.SaveChanges();
    }


    public void Delete(DbSet MySet, object Obj)
    {
        MySet.Attach(Obj);
        var Entry = this.Entry(Obj);
        Entry.State = EntityState.Deleted;
        this.SaveChanges();
    }
4

1 回答 1

5

如果没有看到关于如何更新或创建Subject实体的实际代码,很难说。但是,您可能没有附加教室,因此 EF 假设实体是新的,而实际上并非如此。

     using (Model m = new Model())
     {
        m.Subject.Add(subject);
        m.Classrooms.Attach(subject.Class);
        m.SaveChanges();           
     }

即使 PK 是相同的,如果不附加到上下文,EF 也无法弄清楚你的意图是什么。显式附加实体会告诉您的上下文您想要什么。

于 2012-10-22T01:19:47.880 回答