为什么 Entity Framework 尝试插入现有实体?
Why does Entity Framework try to insert existing entity?
我正在使用 Entity Framework(采用代码优先方法),并且使用预期的外键和唯一键约束成功创建了数据库。
我有这两个型号 类:
public class Foo
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public Bar Bar { get; set; }
}
public class Bar
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
[Index(IsUnique = true), StringLength(512)]
public string Url { get; set; }
}
而这个应用代码:
var foo = GetData();
using (DatabaseContext db = new DatabaseContext())
{
db.Entry(foo).State = EntityState.Added;
if (foo.Bar != null)
{
var bar = await db.Bar.FirstOrDefaultAsync(x => x.Url == foo.Bar.Url);
if (bar != null)
{
// When I assign an existing entity ...
foo.Bar = bar;
}
}
// ... following exception will be thrown.
await db.SaveChangesAsync();
}
SqlException: Cannot insert duplicate key row in object 'dbo.Bar' with unique index 'IX_Url'. The duplicate key value is (https://api.example.com/rest/v1.0/bar/FD6FAB72-DCE2-47DB-885A-424F3D4A70B6).
The statement has been terminated.
我不明白为什么 Entity Framework 试图添加导航 属性 Bar
,即使在从同一个 DbContext
获取并分配它之后也是如此。类似的 Whosebug 问题尚未提供任何可行的解决方案。
如果我需要提供更多信息,请告诉我。
我是否忘记设置任何与 EF 相关的配置或类似的东西?提前致谢!
因为
db.Entry(foo).State = EntityState.Added;
也将 foo.Bar
(以及上下文未跟踪的任何引用实体)标记为 Added
。
您应该在添加 Foo
实体之前解析引用的实体:
var foo = GetData();
using (DatabaseContext db = new DatabaseContext())
{
// Resolve references
if (foo.Bar != null)
{
var bar = await db.Bar.FirstOrDefaultAsync(x => x.Url == foo.Bar.Url);
if (bar != null)
foo.Bar = bar;
}
// Then add the entity
db.Entry(foo).State = EntityState.Added;
await db.SaveChangesAsync();
}
我正在使用 Entity Framework(采用代码优先方法),并且使用预期的外键和唯一键约束成功创建了数据库。
我有这两个型号 类:
public class Foo
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public Bar Bar { get; set; }
}
public class Bar
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
[Index(IsUnique = true), StringLength(512)]
public string Url { get; set; }
}
而这个应用代码:
var foo = GetData();
using (DatabaseContext db = new DatabaseContext())
{
db.Entry(foo).State = EntityState.Added;
if (foo.Bar != null)
{
var bar = await db.Bar.FirstOrDefaultAsync(x => x.Url == foo.Bar.Url);
if (bar != null)
{
// When I assign an existing entity ...
foo.Bar = bar;
}
}
// ... following exception will be thrown.
await db.SaveChangesAsync();
}
SqlException: Cannot insert duplicate key row in object 'dbo.Bar' with unique index 'IX_Url'. The duplicate key value is (https://api.example.com/rest/v1.0/bar/FD6FAB72-DCE2-47DB-885A-424F3D4A70B6). The statement has been terminated.
我不明白为什么 Entity Framework 试图添加导航 属性 Bar
,即使在从同一个 DbContext
获取并分配它之后也是如此。类似的 Whosebug 问题尚未提供任何可行的解决方案。
如果我需要提供更多信息,请告诉我。
我是否忘记设置任何与 EF 相关的配置或类似的东西?提前致谢!
因为
db.Entry(foo).State = EntityState.Added;
也将 foo.Bar
(以及上下文未跟踪的任何引用实体)标记为 Added
。
您应该在添加 Foo
实体之前解析引用的实体:
var foo = GetData();
using (DatabaseContext db = new DatabaseContext())
{
// Resolve references
if (foo.Bar != null)
{
var bar = await db.Bar.FirstOrDefaultAsync(x => x.Url == foo.Bar.Url);
if (bar != null)
foo.Bar = bar;
}
// Then add the entity
db.Entry(foo).State = EntityState.Added;
await db.SaveChangesAsync();
}