我有两个相关的类,如:
public partial class WorkItem
{
public WorkItem()
{
this.ChildWorkItems = new HashSet<WorkItem>();
this.Attachments = new HashSet<Attachment>();
}
public int Id { get; set; }
public Nullable<int> ParentId { get; set; }
public string Title { get; set; }
public string SenderUserName { get; set; }
public virtual ICollection<WorkItem> ChildWorkItems { get; set; }
public virtual WorkItem ParentWorkItem { get; set; }
public virtual ICollection<Attachment> Attachments { get; set; }
}
和实际的1-n附件:
public partial class Attachment
{
public int Id { get; set; }
public string Filename { get; set; }
public Nullable<int> WorkItemId { get; set; }
public virtual WorkItem WorkItem { get; set; }
}
现在我想将一些新的workitems
及其附件插入数据库。我使用以下代码进行插入:
首先放入所有工作项目(不论其附件如何)
var workItems = new List<WorkItem>();
foreach (var username in AllUsers)
{
var workitem = new WorkItem();
//fill the simple fields
lst.Add(workitem);
Context.WorkItems.Add(workitem);
}
然后设置附件:
foreach (var fileName in MYFILES)
{
var file = new System.IO.FileInfo(fileName);
foreach (var workItem in workItems)
{
var att =
new Attachment()
{
Filename = file.Name,
};
context.Attachments.Add(att);
att.WorkItem = workItem;
}
}
但我得到以下例外:
违反了多重约束。 “AienCRMModel.FK_WorkItemAttachments_WorkItems”关系的“WorkItem”角色具有多重性1或0..1。
有趣的是,如果我只有一个 workitem
,一切都还可以。如果我有多个WorkItem
没有附件,那么一切都还可以。当具有多个具有至少一个附件的WorkItem时,问题会引发。
我阅读了很多其他帖子,但没有发现任何usefuk。
注意: 我使用EF Code-First 4.3和T4模板,它从EDMX文件生成我的类。
修改 我附上了上述表格的完整EDMX图表:
编辑2
在此完成.edmx文件:http://www.4shared.com/file/zQUO_qk7/CrmModel141.html?
答案 0 :(得分:0)
在代码中的某个地方,您正在为数据库中的不同行使用相同的对象实例,如下所示(仅作为示例):
var o1 = new O1Class();
foreach (var o2 in collection)
{
o2.O1s.Add(o1);
}
但必须是:
foreach (var o2 in collection)
{
o2.O1s.Add(new O1Class());
}
我这个例子O1Class在它们的关系中只能有一个O2Class,但实体框架保留了对o1实例的引用,所以当你把它添加到多个O2Class实例时,EF会认为当前的O1Class有多个不正确的O2Class实例