Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在EF4.1 code first中,使用注释、配置文件或OnModelCreating配置实体之间有什么区别?_C#_Asp.net_Entity Framework_Ef Code First_Entity Framework 4.1 - Fatal编程技术网

C# 在EF4.1 code first中,使用注释、配置文件或OnModelCreating配置实体之间有什么区别?

C# 在EF4.1 code first中,使用注释、配置文件或OnModelCreating配置实体之间有什么区别?,c#,asp.net,entity-framework,ef-code-first,entity-framework-4.1,C#,Asp.net,Entity Framework,Ef Code First,Entity Framework 4.1,目前,我使用单独的配置文件并调用它们,如: protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new ProductConfiguration()); base.OnModelCreating(modelBuilder); } 看起来大多数在线示例都是非常基本的,所以它们在一个类中定义了它们的模型、DbContext和模型配

目前,我使用单独的配置文件并调用它们,如:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Configurations.Add(new ProductConfiguration());
    base.OnModelCreating(modelBuilder);
}

看起来大多数在线示例都是非常基本的,所以它们在一个类中定义了它们的模型、DbContext和模型配置。是否存在性能和性能问题或其他令人信服的原因来使用其中一个而不是另一个?

不,这只是可读性的问题。随着模型的增长,您可能会在OnModelCreating中获得非常大的配置。为了使其更具可读性,您可以将其分解为不同的配置。

我不知道您对配置文件的确切含义,但定义模型基本上有三个选项:

约定:当您创建模型类时,您以EF可以自动检测主键、外键、关系等的方式命名属性。如果这样做,则不需要任何数据注释,也不需要在模型创建时覆盖

数据注释:当您不能或不想遵循约定规则时非常有用。例如,现有数据库的列名与EF的标准命名规则不匹配,例如,如果有一个键列的名称EF无法识别为键:

public class User
{
    [Key]
    public int User_Code { get; set; }
}
OnModelCreating中的Fluent API:用于无法使用数据注释定义的高级映射场景。例如


就性能而言,我相信你用什么并不重要。方法是一个品味和模型复杂性的问题。EF在应用程序实例的生命周期内仅创建一次内部模型表示。您可以通过在OnModelCreating中设置断点来看到这一点:无论您创建新的DbContext的频率有多高,您只会到达此断点一次。

我看不出您所做的有任何错误。@Chris Marisic-感谢您的信任投票!所有3种变体的语法似乎略有不同,很难找到一组涵盖大多数场景并使用外部实体配置类的可靠示例。我相信配置文件是从OnModelCreatingI提供的示例代码中注册的EntityConfiguration派生的类。。modelBuilder.Configurations.Addnew ProductConfiguration;基本上,它们是外部类,您可以在其中使用fluent API为模型指定映射和规则。因此,对于只需要有限配置的模型,使用数据注释是明智的,还是最好只使用一种方法并对所有模型使用它?@Developr:现在我明白了,实际上我也在这样做。我被术语“文件”弄糊涂了,认为有一些XML配置或我从未见过的东西。读得不够好,对不起。对于您的问题:如果您可以使用数据注释和fluentapi来定义映射,那么在我看来,这确实是一个品味问题。没有性能差异。有些人不喜欢在他们的POCO类中有注释,因此总是喜欢流畅的代码。另一方面,注释很容易应用,您不需要编写代码,也不需要单独的配置类。在较新的模型中,我实际上开始理解EF设计师的意图:1定义您的模型属性和名称,以便EF按照约定进行正确的映射,您不需要任何注释或流畅的代码;2如果约定不符合您的要求,请应用适当的注释;3如果没有适当的注释,使用fluentapi。但正如所说的,遵循这种方法是一个品味问题。+1这是一个非常重要的理由,它也开始落入SRP违规的灰色区域,而使用配置文件则将其分开。