添加新行会抛出“违反多重性约束”

时间:2012-05-01 08:00:11

标签: entity-framework entity-framework-4 ef-code-first code-first

我有两个相关的类,如:

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图表: EDMX diagram

编辑2

在此完成.edmx文件:http://www.4shared.com/file/zQUO_qk7/CrmModel141.html?

1 个答案:

答案 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实例