Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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# 我需要一个映射文件吗?_C#_Entity Framework - Fatal编程技术网

C# 我需要一个映射文件吗?

C# 我需要一个映射文件吗?,c#,entity-framework,C#,Entity Framework,使用EntityFramework6,我想知道是否需要一个映射文件。我有一个这样定义的模型: [Table("UploadedFile")] public partial class UploadedFile { [Key, ForeignKey("Resource"), DatabaseGenerated(DatabaseGeneratedOption.None)] public System.Guid FileId { get; set; } public virtu

使用EntityFramework6,我想知道是否需要一个映射文件。我有一个这样定义的模型:

[Table("UploadedFile")]
public partial class UploadedFile
{
    [Key, ForeignKey("Resource"), DatabaseGenerated(DatabaseGeneratedOption.None)]
    public System.Guid FileId { get; set; }
    public virtual Resource Resource { get; set; }

    //...
    public System.DateTime Modified { get; set; }

    public bool IsActive { get; set; }
    public byte[] RecordVersion { get; set; }

    public UploadedFile()
    {
        Resource = new Resource();
    }
} 
我的映射文件如下所示:

public class UploadedFileMapping : EntityTypeConfiguration<UploadedFile>
{
    public UploadedFileMapping()
    {
        //Primary key 
        HasKey(t => t.FileId);
        //Constraints 
        Property(t => t.RecordVersion).IsRowVersion();
    }
}
公共类UploadedFileMapping:EntityTypeConfiguration { 公共上载的FileMapping() { //主键 HasKey(t=>t.FileId); //约束条件 属性(t=>t.RecordVersion).IsRowVersion(); } } 我可以仅仅依靠模型中的属性吗?使用映射文件的优点/缺点是什么


我相信模型中的
[Key]
属性不需要HasKey,对吗?

EF Fluent Api优于数据注释,因为它允许域模型层隔离,并且更灵活(例如,IsRowVersion可能只在Fluent Api中添加)。
键属性是冗余的。

EF Fluent Api优于数据注释,因为它允许域模型层隔离,并且更灵活(例如,IsRowVersion可能只在Fluent Api中添加)。
键属性是冗余的。

您可以使用基于属性的映射。在您的案例中不需要映射文件。但我建议学习并使用fluentapi

通常,您有多种选择:

不要使用任何显式映射-只依赖约定(内置或自定义)。它可以在简单的情况下使用。为此,DbContext应该通过DbSet或通过对已知类型的引用了解实体

  • 优点:
    • 不需要额外的代码
  • 缺点:
    • 您必须了解所有约定,而此解决方案并不灵活
使用数据注释。基于属性的映射非常严格和简单

  • 优点:
  • 很简单
  • 它不仅可用于实体框架,还可用于验证(例如,在ASP.NET MVC或WPF中)
  • 某些属性只能通过数据注释来定义(例如MinValue和DefaultValue)
  • 缺点:
    • 它不如fluentapi灵活
    • 由于大量的属性,读取模型的代码可能有点困难
    • 您的模型与实体框架紧密耦合
使用Fluent Api(具有映射文件)。这是最高级的场景,具有更多的可能性(请查看更详细的参考资料)

  • 优点:
    • 它很灵活。您可以有更多的映射可能性
    • 您可以拥有没有实体框架依赖关系的干净域模型
  • 缺点:
    • 这可能有点困难
您还可以结合前面的3种方法。您可以同时使用所有这些解决方案。 例如:

  • 您对默认命名约定感到满意,因此不必为表定义名称
  • 您可以使用数据注释重用它们进行验证
  • 可以使用Fluent Api定义数据注释零件不支持的

    • 缺点:
    • 要找出整个配置有点复杂,因为它是在多个地方定义的。因此,请仔细使用这种方法

  • 您可以只使用基于属性的映射。在您的案例中不需要映射文件。但我建议学习并使用fluentapi

    通常,您有多种选择:

    不要使用任何显式映射-只依赖约定(内置或自定义)。它可以在简单的情况下使用。为此,DbContext应该通过DbSet或通过对已知类型的引用了解实体

    • 优点:
      • 不需要额外的代码
    • 缺点:
      • 您必须了解所有约定,而此解决方案并不灵活
    使用数据注释。基于属性的映射非常严格和简单

    • 优点:
    • 很简单
    • 它不仅可用于实体框架,还可用于验证(例如,在ASP.NET MVC或WPF中)
    • 某些属性只能通过数据注释来定义(例如MinValue和DefaultValue)
    • 缺点:
      • 它不如fluentapi灵活
      • 由于大量的属性,读取模型的代码可能有点困难
      • 您的模型与实体框架紧密耦合
    使用Fluent Api(具有映射文件)。这是最高级的场景,具有更多的可能性(请查看更详细的参考资料)

    • 优点:
      • 它很灵活。您可以有更多的映射可能性
      • 您可以拥有没有实体框架依赖关系的干净域模型
    • 缺点:
      • 这可能有点困难
    您还可以结合前面的3种方法。您可以同时使用所有这些解决方案。 例如:

  • 您对默认命名约定感到满意,因此不必为表定义名称
  • 您可以使用数据注释重用它们进行验证
  • 可以使用Fluent Api定义数据注释零件不支持的

    • 缺点:
    • 要找出整个配置有点复杂,因为它是在多个地方定义的。因此,请仔细使用这种方法

  • 然而,这更像是一种痛苦。我不会完全同意域模型隔离。。。这取决于您在应用程序中使用DTO/ViewModels/Models的程度。而且,您应该只真正地从数据库中投射出您真正想要的东西,所以永远不应该用代码对整个数据库进行建模。(这仅用于创建表和迁移)但是,这有点麻烦。我不会完全同意域模型隔离。。。这取决于您在应用程序中使用DTO/ViewModels/Models的程度。而且,您应该只真正地从数据库中投射出您真正想要的东西,所以永远不应该用代码对整个数据库进行建模。(我是索莱尔