c# - Entity Framework 具有相同键的两个不同对象不起作用

标签 c# entity-framework

我试图在我的主对象中插入对象引用,但如果我不使用它以前管理的对象,EntityFramework 会提示。我只是想在创建对象时避免依赖 dbContext。

简化示例:

class Movie {
    public ApplicationUser Owner { get;set; }
}

var myMovie = db.Movies.FirstOrDefault(m, m => m.Id = 1);
myMovie.Owner = new ApplicationUser { Id = 2 };

// I have to attach or change its state, otherwise, EF will complain the object is not complete
db.Entry(myMovie.Owner).State = EntityState.Unchanged;

不知何故,如果相同的 ApplicationUser 先前已被上下文加载,我会收到此错误:

Saving or accepting changes failed because more than one entity of type 'ApplicationUser' have the same primary key value. Ensure that explicitly set primary key values are unique. Ensure that database-generated primary keys are configured correctly in the database and in the Entity Framework model. Use the Entity Designer for Database First/Model First configuration. Use the 'HasDatabaseGeneratedOption" fluent API or 'DatabaseGeneratedAttribute' for Code First configuration.

如何避免这个问题?最理想的是,我不想告诉那个新对象的状态。

最佳答案

如果你有一个你只读取数据而不修改它的实例,你可以使用 AsNoTracking() 这将防止有一个你的上下文知道的模型的附加实例(它本质上是只读)。

即使两次检索同一个对象,以下代码也应该可以工作。

var myMovieReadOnly = db.Movies.AsNoTracking().FirstOrDefault(m, m => m.Id = 1);

var myMovie = db.Movies.FirstOrDefault(m, m => m.Id = 1);
myMovie.Owner = new ApplicationUser { Id = 2 };

db.SaveChanges();

另一个注意事项是,在您仅读取数据的情况下,AsNoTraking() 还可以节省性能。


编辑:重新阅读并意识到它是 ApplicationUser 模型而不是电影,但相同的概念应该适用于第一个实例的检索。


编辑2:

根据我们的评论,您还可以执行以下操作,如果您已经知道 ID,则完全不需要进行查找:

class Movie {
    public int OwnerId { get;set; }
    public ApplicationUser Owner { get;set; }
}

var myMovie = db.Movies.FirstOrDefault(m, m => m.Id = 1);
myMovie.OwnerId = 2;
db.SaveChanges();

关于c# - Entity Framework 具有相同键的两个不同对象不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26518508/

相关文章:

c# - Windows 窗体应用程序中的滑动效果

c# - SQLite 1.0.94 未出现在 EDM 提供程序上

c# - 在 IQueryable<T> 上应用多个组函数

mysql - "MySql.Data.MySqlClient.MySqlException: Illegal mix of collations for operation ' UNION' 创建新的 ADO NET 模型时 VS 2015

c# - 为什么不能在 .NET 中定义通用索引器?

java - MD5 hashing在IOS和windows中相同,在java中不同

c# - 如何检查MonoDevelop中使用的是哪个编译器?

c# - asp.net 中的目录浏览器

c# - JSON Serializer 尝试访问早已消失的 EntityFramework 上下文,以获取我没有要求或不关心的数据

c# - 从 Entity Framework 中的原始 SQL 查询返回多个相关实体类型