0

我有两个相关的类,例如:

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; }
}

和 realted 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 和至少一个附件时,就会出现问题。

我阅读了很多其他帖子,但没有发现任何有用的信息。

注意:我使用 EF Code-First 4.3 和 T4 模板,它从 EDMX 文件生成我的类。

我真的很感谢您提前提供的帮助。

编辑 我在这里附上了提到的表格的完整 EDMX 图: EDMX 图

编辑 2

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

4

1 回答 1

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 实例,这是不正确的。

于 2013-05-26T07:25:33.317 回答