我需要一个映射文件吗?

时间:2015-10-19 20:08:40

标签: c# entity-framework

使用Entity Framework 6,我想知道是否需要Mapping文件。我的模型定义如下:

[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();
    }
}

我可以依靠模型中的属性吗?使用映射文件的优缺点是什么?

我相信模型中的[Key]属性否定了对HasKey的需求,这是正确的吗?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您可以使用基于属性的映射。在您的情况下不需要映射文件。但我建议学习Fluent Api并使用它。

通常,您有多种选择:

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

  • 优点:
    • 无需其他代码。
  • 缺点:
    • 您必须了解所有惯例,此解决方案不灵活。

使用数据注释。基于属性的映射非常简单直接。

  • 优点:
  • 很简单。
  • 它不仅可以用于实体框架,还可以用于验证(例如,在ASP.NET MVC或WPF中)。
  • 某些属性只能通过数据注释(例如MinValue和DefaultValue)定义。
  • 缺点:
    • 它不像Fluent Api那么灵活。
    • 由于属性很大,读取模型代码可能有点困难。
    • 您的模型与实体框架紧密结合。

使用Fluent Api(具有映射文件)。它是最先进的场景,具有更多可能性(请查看here以获取更详细的参考信息)。

  • 优点:
    • 它很灵活。您可以有更多的映射可能性。
    • 您可以拥有没有实体框架依赖关系的干净域模型。
  • 缺点:
    • 可能有点困难。

此外,您还可以结合前3种方法。您可以一起使用所有这些解决方案。 例如:

  1. 您对默认命名约定感到满意,因此您无需为表定义名称。
  2. 您可以使用数据注释将其重复用于验证。
  3. 您可以使用Fluent Api定义Data Annotation部件不支持。

    • 缺点:
    • 找出整个配置有点复杂,因为它在多个地方定义。所以要小心使用这种方法。