C# 我需要一个映射文件吗?
使用EntityFramework6,我想知道是否需要一个映射文件。我有一个这样定义的模型: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
[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灵活
- 由于大量的属性,读取模型的代码可能有点困难
- 您的模型与实体框架紧密耦合
- 优点:
- 它很灵活。您可以有更多的映射可能性
- 您可以拥有没有实体框架依赖关系的干净域模型
- 缺点:
- 这可能有点困难
- 缺点:
- 要找出整个配置有点复杂,因为它是在多个地方定义的。因此,请仔细使用这种方法
您可以只使用基于属性的映射。在您的案例中不需要映射文件。但我建议学习并使用fluentapi 通常,您有多种选择: 不要使用任何显式映射-只依赖约定(内置或自定义)。它可以在简单的情况下使用。为此,DbContext应该通过DbSet或通过对已知类型的引用了解实体
- 优点:
- 不需要额外的代码
- 缺点:
- 您必须了解所有约定,而此解决方案并不灵活
- 优点:
- 很简单
- 它不仅可用于实体框架,还可用于验证(例如,在ASP.NET MVC或WPF中)
- 某些属性只能通过数据注释来定义(例如MinValue和DefaultValue)
- 缺点:
- 它不如fluentapi灵活
- 由于大量的属性,读取模型的代码可能有点困难
- 您的模型与实体框架紧密耦合
- 优点:
- 它很灵活。您可以有更多的映射可能性
- 您可以拥有没有实体框架依赖关系的干净域模型
- 缺点:
- 这可能有点困难
- 缺点:
- 要找出整个配置有点复杂,因为它是在多个地方定义的。因此,请仔细使用这种方法
然而,这更像是一种痛苦。我不会完全同意域模型隔离。。。这取决于您在应用程序中使用DTO/ViewModels/Models的程度。而且,您应该只真正地从数据库中投射出您真正想要的东西,所以永远不应该用代码对整个数据库进行建模。(这仅用于创建表和迁移)但是,这有点麻烦。我不会完全同意域模型隔离。。。这取决于您在应用程序中使用DTO/ViewModels/Models的程度。而且,您应该只真正地从数据库中投射出您真正想要的东西,所以永远不应该用代码对整个数据库进行建模。(我是索莱尔