【问题标题】:EF: How to reuse newly created foreign keyEF:如何重用新创建的外键
【发布时间】:2013-07-08 17:42:06
【问题描述】:

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

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

 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,
                }
            })

它应该使用之前创建的外键(因为我可能有一个唯一的常量)。 当我试图在参考表中插入重复记录时。我在这里需要的是,Entity Frame 工作应该添加第一个组织详细信息,并且应该使用相同的 ID 来处理相同记录的后续出现(在本例中为 Description 列)。

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

【问题讨论】:

  • 我终于得到了解决方案,我们设置了一次外键/引用对象,EF 足够聪明,可以使用新生成的引用表身份进行任何连续使用(如果我们没有设置外键键/参考对象)

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


【解决方案1】:

您在 MaterialLineEntry 中有外键“OrganizationId”。要重用现有的组织,您必须仅将现有 ID 分配给 OrganizationId。例如

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();

【讨论】:

  • 感谢 nhrobin 的回复,如果我添加现有的“OrganizationId”,解决方案可以正常工作,但在我的情况下,我需要创建一个新的组织并在连续的行条目中分配它。例如,对于第 1 行,我需要一个新的组织“XYZ”,而对于第 2 行,我需要相同的组织“XYZ”。
  • 这是个好主意,但在我的场景中,我只能将整个对象发送到 DAL,在那里我可以保存更改或提交更改。所以我需要在将它发送到 DAL 层之前构造对象。我尝试通过为第一行条目创建一个新的 Ogranisation 对象并将第二个保持为空,它运行良好 ;-),但现在如果我有三个行条目,第一个作为新对象,第二个作为空,第三个作为新对象,但它给了我例外(无法确定“MaterialLineEntery_Organisation”关系的主体端。多个添加的实体可能具有相同的主键)
猜你喜欢
  • 2021-08-10
  • 1970-01-01
  • 2021-03-01
  • 2018-09-02
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多