在定义关系时,什么时候必须使用fluent api

本文关键字:fluent api 什么时候 定义 关系 | 更新日期: 2023-09-27 18:15:12

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

在定义关系时,什么时候必须使用fluent api

你能用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

您可以将两者结合使用。就我个人而言,我更喜欢数据注释,因为在编写类时设置它们似乎更简单。它也更容易在以后引用,因为它包含在那里。正如您所说,有时您需要使用fluent api来修改某些内容,但如果您不需要它,那么使用数据注释就不那么麻烦了。

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