3

我一直在修改在实体框架生成的模型中包含外键的选项(来自现有的 MSSQL 数据库)。

假设我有一个 Person 和 Company 模型,我想同时创建这两个模型。公司可以有多个人员。Person 有 Id、Name、CompanyId,Company 有 Id 和 Name。

我不太确定我应该如何创建彼此相关的新对象。我想出的一种方法如下:

// Company needs ID and Name, and ID is auto generated, so -1
Model.Company newCompany = Model.Company.CreateCompany(-1, "Test Inc");

// Person needs ID, Name and a CompanyID. What is CompanyId supposed to be?
Model.Person newPerson = Model.Person.CreatePerson(-1, "John Doe", -1);

// And to actually get the Company relation going
newPerson.Company = newCompany;

然后将其添加到上下文并保存。

现在,这行得通,但我不确定这是我应该做的吗?

因为,如果我们改为想象我会抽象这些的创作(这是我在应用程序的大部分部分中拥有的)。也许我们有以下功能,我仍然必须提供 ID,即使这个对象的 EntityState 是未知的。据我所知,它可能有一个 ID,并非所有公司都是新公司。所以我不能这样做:

public static Model.Person CreatePerson(string name, Model.Company company) {
    Model.Person newPerson = Model.Person.CreatePerson(-1, name, company.Id);
    return newPerson;
}

但是如果 company 是新添加的对象,这将失败。因此,我是否认为在 Create-method 中使用实际 ID 是无用的?因为除非我检查实体状态,否则我最终将不得不执行以下操作:

public static Model.Person CreatePerson(string name, Model.Company company) {
    Model.Person newPerson = Model.Person.CreatePerson(-1, name, -1);
    newPerson.Company = company;
    return newPerson;
}

我意识到在您有 ID 但没有对象的情况下使用外键 ID 创建对象的好处,并且您实际上不需要从数据库中获取整个对象。但我对如何最好地处理这件事感到非常困惑。

4

1 回答 1

1

您可能必须同时设置外键属性和导航属性以涵盖Company方法中新的和现有的两种情况:

public static Model.Person CreatePerson(string name, Model.Company company) {
    Model.Person newPerson = Model.Person.CreatePerson(-1, name, company.Id);
    newPerson.Company = company;
    return newPerson;
}
  • If companyis new EF 将忽略该newPerson.CompanyId值并仅基于导航属性创建关系newPerson.Company
  • 如果company存在(在 stateUnchanged或中Modified),则 FK 属性newPerson.CompanyId必须与主键 value 匹配newPerson.Company.Id,否则会出现异常。
于 2012-10-30T16:19:48.443 回答