0

我之间有以下关系,Person并按Country约定定义。这完美地工作。

public class Person
{
    public long PersonId {get; set;}
    public string Name {get; set;}

    public long CountryId {get; set;}
    public virtual Country Country {get; set;}
}

public class Country
{
    public long CountryId {get; set;}
    public string Name {get; set;}
}

我现在希望将属性名称更改为其他名称Country。据我了解,这意味着按照惯例,这种关系不再有效。所以我希望使用流利的语法来定义它。

我找到了这个参考,但我不清楚我应该如何处理这个确切的场景,因为在他们的例子中,关系的两边都包含一个外键或集合。

有一节“配置与一个导航属性的关系”让我认为它应该如下所示:

modelBuilder.Entity<Patient>() 
    .HasRequired(t => t.Country) 
    .WithRequiredPrincipal();

但是,每当存储国家/地区时,都会导致以下异常

{"The INSERT statement conflicted with the FOREIGN KEY constraint \"FK_dbo.Countries_dbo.Patients_CountryId\". The conflict occurred in database \"TESTS_ffbe7a6e73a747ce8cda71f963bb20b7\", table \"dbo.Patients\", column 'PatientId'.\r\nThe statement has been terminated."}

所以我现在的问题是: - 如何使用流利的语法定义上述“按惯例”关系?- 使用流利语法时是否仍需要 CountryId 属性?

4

1 回答 1

1

在您的示例代码中,您表达了这一点:

  • Entity<Patient>().HasRequired(t => t.Country): 每个病人必须有一个相关的国家
  • .WithRequiredPrincipal(): 每个国家都必须有一个相关的病人

我想您不需要每个国家/地区都有一名或多名相关患者。所以,这样做:

  modelBuilder.Entity<Person>()
              .HasRequired(p => p.Country)
              .WithMany();

这意味着每个人必须有一个国家,每个国家可以有许多相关的人。而且您没有指定从一个国家到另一个人的导航。

要理解这种流畅的 API 关系,请考虑第一个函数(即HasRequired)是从第一个实体到第二个实体的关系。然后,第二个函数(即WithXXX)是从第二个实体返回到第一个实体的关系。

借助 Fluent API,可以轻松表达任何类型的关系而不会出错。此外,还有带或不带参数的重载允许您指定导航属性,或者如果它们不存在则省略它们。例如,如果您需要使用属性从国家导航回人员Persons,它看起来像这样:

  WithMany(c => c.Persons)
于 2014-11-19T11:12:44.383 回答