【问题标题】:when is it mandatory to use fluent api when defining relationships [closed]定义关系时何时必须使用 fluent api [关闭]
【发布时间】:2015-09-30 12:42:45
【问题描述】:

我想知道在定义 1:M、1:1 和 M:M 关系时是否必须使用 fluent api。我知道 fluent api 提供了数据注释无法做到的更多功能。但是,如果我们只考虑没有额外要求的直接关系(例如,重命名 M:M 关系中的外键,或者 CascadeOnDelete 等),我们可以只依赖数据注释吗?还是因为某些原因使用fluent api 更好?

【问题讨论】:

  • 基础知识不需要流利的 api。如果您遵循约定 (msdn.microsoft.com/en-us/data/…),您甚至不需要注释。我喜欢流利的 api,因为这样我可以保持我的 POCO 干净并分离关注点。
  • 设置级联删除为false和多对多映射表配置是我能想到的两种。
  • 不确定您是否也可以使用数据注释来做复合键。

标签: c# entity-framework data-annotations ef-fluent-api


【解决方案1】:

您可以用DataAnnotation 做的所有事情都可以用FluentAPI 做,但反之则不然。某些功能仅在 FluentAPI 中可用。

我应该使用哪个?

取决于你想要做什么。

有些关系可以在类结构中声明。例如,一个 n:m 关系可以声明如下:

public class Foo 
{
    public ICollection<Bar> Bars { get; set; }
} 

public class Bar
{
    public ICollection<Foo> Foos { get; set; }
}

EF 将识别 n:m: 关系并创建“第三个表”。但是,如果要“选择”第三个表的名称,则必须使用FluentAPI

modelBuilder.Entity<Foo>()
    .HasMany(s => s.Bars)
    .WithMany(c => c.Foos)
    .Map(cs =>
        {
            cs.MapLeftKey("FooId");
            cs.MapRightKey("BarId");
            cs.ToTable("FooBarRelationship");
 });

DataAnnotationFluentAPI 更简单,但是如果你的类位于不同的程序集中,你必须添加System.Data.ComponentModel 的引用,这不是很好。

FluentAPI 看起来很复杂,但它可以做DataAnnotation 可以做的所有事情,甚至更多。此外,您可以在课堂之外毫无问题地使用它。特别是我更喜欢FluentAPI,因为它看起来更干净、更有条理。

此外,如果您选择DataAnnotation,请记住您可能还必须使用FluentAPI。所以,如果你只想使用一种方法,你必须选择FluentAPI

【讨论】:

    【解决方案2】:

    您可以将两者结合使用。就我个人而言,我更喜欢数据注释,因为在你写课程时设置它们对我来说似乎更简单。由于它包含在那里,因此以后也更容易参考。正如您所说,有时您需要使用 fluent api 修改某些内容,但如果您不需要它,则使用数据注释会减少输入。

    事实上,如果您正在处理简单的关系,大多数时候您甚至不需要显式使用数据注释,因为 EF 可以根据键和命名约定推断关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-31
      • 2014-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      相关资源
      最近更新 更多