我想知道在定义1:M,1:1和M:M关系时是否必须使用流畅的api。我知道流畅的api提供了更多的功能,数据注释无法做到。但是,如果我们只考虑没有额外要求的直接关系(例如,重命名M:M关系中的外键,或者CascadeOnDelete等),我们可以只依靠数据注释吗?或者出于某些原因使用流畅的api还是更好吗?
答案 0 :(得分:1)
您可以将两者结合使用。我个人更喜欢数据注释,因为在你写出课程的时候设置它们似乎更简单。之后它也更容易引用,因为它包含在那里。正如您所说,有时您需要使用流畅的api修改某些内容,但如果您不需要它,那么使用数据注释的输入就会减少。
事实上,如果你正在做简单的关系,你甚至不需要在大多数时候明确地使用数据注释,因为EF可以根据键和命名约定来推断关系。
答案 1 :(得分: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");
});
DataAnnotation
比FluentAPI
更简单,但如果您的类位于不同的程序集中,则必须添加System.Data.ComponentModel
的引用,这不是很好。
FluentAPI
似乎很复杂,但它可以执行DataAnnotation
可以执行的所有操作,甚至更多。此外,您可以在课外使用它而不会出现问题。特别是,我更喜欢FluentAPI
,因为它看起来更干净整洁。
此外,如果您选择DataAnnotation
,请注意您可能还必须使用FluentAPI
。因此,如果您只想使用一种方法,则必须选择FluentAPI
。