EF:如何重用新创建的外键

时间:2013-07-08 17:42:06

标签: .net c#-4.0 entity-framework-4 entity-framework-4.1

我是EF的新手并且在我的一个场景中停留在那里,我需要在参考表中创建或使用键。 用户可以在参考表中创建新记录,也可以使用现有记录。为此,我创建了我的实体模型,如下所示:

 Public class MaterialLineEntry()
 {
    EntryNumber = 0,
    OrganisationID=0,
    Organisation  Organisation 
  };

AND

 Public class Organisation ()
  {
     ID = 0,                            
     Description = "Test",
     EntityChangeStatus ;
   };

这些行条目在另一个名为Report

的实体中定义
Public class Report()
{
         List<  MaterialLineEntry> materilaLineEntries;
 };

如果我输入如下所示的详细信息并将对象(报告)附加到UnitOfWork并将其汇总,那么一切正常。实体框架在引用表中创建记录,并使用新生成的外键在行条目表中输入它。

Report report =new Reort();
        report. materilaLineEntries.Add(new MaterialLineEntry()
            {
                EntryNumber=1,
                OrganisationID=0,
                Organisation=new Organisation()
                {
                    ID = 0,
                    Description = "Test",
                    EntityChangeStatus = EntityChangeStatus.Unchanged,
                }
            })

但是当我向具有相同组织细节的行条目添加两个对象时:

 report. materilaLineEntries.Add(new MaterialLineEntry()
            {
                EntryNumber=1,
                OrganisationID=0,
                Organisation=new Organisation()
                {
                    ID = 0,
                    Description = "Test",
                    EntityChangeStatus = EntityChangeStatus.Unchanged,
                }
            })

它应该使用以前创建的外键(因为我可能有一个唯一的constrant)。 因为我试图在参考表中插入重复记录。我需要的是,实体框架工作应该添加第一个组织细节,并且应该使用相同的ID来发生相同记录(在本例中为描述列)。

请帮我解决这个问题。提前致谢。 (我曾想过在外表中逐一添加数据并进一步使用外键,但我想这是一个坏主意。)

1 个答案:

答案 0 :(得分:0)

您在MaterialLineEntry中有外键“OrganizationId”。要重新使用现有组织,您必须仅为OrganizationId分配一个exisitng id。 e.g。

report. materilaLineEntries.Add(new MaterialLineEntry()
            {
                EntryNumber=1,
                OrganisationID=0,//Id of a exsiting organization

            });

编辑:完整代码

Report report =new Reort();
var org=new Organisation()
                {
                    Description = "Test",
                    EntityChangeStatus = EntityChangeStatus.Unchanged,
                };
        report. materilaLineEntries.Add(new MaterialLineEntry()
            {
                EntryNumber=1,
                OrganisationID=0,
                Organisation=org
            });
        report.SaveChanges();
        report. materilaLineEntries.Add(new MaterialLineEntry()
                {
                    EntryNumber=1,
                    OrganisationID=org.Id,//Id of a exsiting organization

                });
       report.SaveChanges();