WoI*_*IIe 3 c# entity-framework navigation-properties data-annotations ef-code-first
我正在使用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; }
}
Run Code Online (Sandbox Code Playgroud)
而这个应用程序代码:
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();
}
Run Code Online (Sandbox Code Playgroud)
SqlException:无法在具有唯一索引“ IX_Url”的对象“ dbo.Bar”中插入重复的键行。重复的键值为(https://api.example.com/rest/v1.0/bar/FD6FAB72-DCE2-47DB-885A-424F3D4A70B6)。该语句已终止。
我不理解为什么实体框架试图添加导航属性Bar,即使从相同的属性中获取和分配了它DbContext。类似的StackOverflow问题尚未提供任何可行的解决方案。
请告诉我是否需要提供其他信息。
我是否忘记设置任何与EF相关的配置或类似的设置?先感谢您!
这是因为
db.Entry(foo).State = EntityState.Added;
Run Code Online (Sandbox Code Playgroud)
也标记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();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
355 次 |
| 最近记录: |