【发布时间】:2013-11-20 14:15:18
【问题描述】:
我正在尝试使用 Code First 流畅符号保存我已映射到 EF6 的 POCO 的对象图。
然而,在保存对象图时,我偶然发现了主键违规异常。
对象图很简单:
一个Issue 可以包含多个WorkItems,每个Author(如User)。
对象在外部填充(使用 Web API)
当我尝试使用两个引用同一作者的工作项保存问题时,我希望插入该问题,插入工作项并插入一位作者,另一位被引用或被更新了。
然而发生的情况是问题被插入,工作项被插入并且对同一用户的两个引用被插入,导致主键冲突。
简化的问题对象:
public class Issue
{
public Issue()
{
WorkItems = new List<WorkItem>();
}
public string Id { get; set; }
private List<WorkItem> _workItems;
public List<WorkItem> WorkItems
{
get { return _workItems ?? new List<WorkItem>(); }
set { _workItems = value; }
}
}
简化的工作项:
public class WorkItem
{
public string Id { get; set; }
public string AuthorLogin
{
get; set;
}
private WorkItemAuthor _author;
public WorkItemAuthor Author
{
get { return _author; }
set { _author = value;
if (value != null)
{
AuthorLogin = value.Login;
}
else
{
AuthorLogin = string.Empty;
}
}
}
}
简化的用户对象:
public class User
{
public string Login { get; set; }
public string FullName { get; set; }
}
他们的代码优先配置:
internal IssueConfiguration()
{
HasKey(x => x.Id);
HasMany(x => x.WorkItems);
}
internal WorkItemConfiguration()
{
HasKey(x => x.Id);
HasRequired(p => p.Author)
.WithMany(b => b.WorkItems)
.HasForeignKey(x=>x.AuthorLogin);
}
internal UsersConfiguration()
{
HasKey(x => x.Login);
}
一切都很简单。在创建数据库时,de 表看起来也很漂亮,而且在人们期望它们的列上有 FKs
现在保存问题时,最好插入对象图,并且可以自动识别对现有对象的引用,并且可以选择仅插入或引用。
我尝试相应地添加问题:
using (var db = new Cache.Context())
{
if (db.Issues.Any(e => e.Id == issue.Id))
{
db.Issues.Attach(issue);
db.Entry(issue).State = EntityState.Modified;
}
else
{
db.Issues.Add(issue);
}
db.SaveChanges();
}
这个问题的解决方案是我遍历对象图以手动添加或附加图中的其他对象吗?我希望通过定义正确的外键值来识别这些引用。
【问题讨论】:
标签: c# entity-framework ef-code-first primary-key entity-framework-6