Entity framework 实体框架代码生成表中的第一个继承属性顺序
我先编写代码,因为我的许多POCO对象共享一些属性,所以我决定用继承来设置。下面是我的两个数据对象Entity framework 实体框架代码生成表中的第一个继承属性顺序,entity-framework,inheritance,ef-code-first,Entity Framework,Inheritance,Ef Code First,我先编写代码,因为我的许多POCO对象共享一些属性,所以我决定用继承来设置。下面是我的两个数据对象 public abstract class BaseDataObject { [Key] public Guid Id {get; set;} public string Name {get; set;} } public class DataObject1: BaseDataObject { public string SomeProperty {get; s
public abstract class BaseDataObject
{
[Key]
public Guid Id {get; set;}
public string Name {get; set;}
}
public class DataObject1: BaseDataObject
{
public string SomeProperty {get; set;}
}
public class DataObject2: BaseDataObject
{
public string OtherProperty {get; set;}
}
现在,如果EF生成我的表,它将创建两个具有以下属性的表
数据对象1
Id(唯一标识符,主键)
SomeProperty(nvarchar(最大))
名称(nvarchar(最大值))
数据对象2
Id(唯一标识符,主键)
OtherProperty(nvarchar(最大))
名称(nvarchar(最大值))
所以它把钥匙放在第一位。。但是我的BaseDataObject的另一个属性被添加到了末尾。我宁愿在Id之后立即拥有这些属性。。因此,首先是BaseDataObject的属性,然后是派生对象的属性
在生成我的表时,有没有办法告诉EF这样做?我知道这只是化妆品,但还是。。。如果有人直接查看数据库,那么将这些“基本属性”放在末尾似乎相当混乱
谢谢。您可以使用映射文件来完成此操作。运行迁移时,它将按照该顺序构建表。这需要每个实体都有一个映射文件。我不知道有什么方法可以在迁移工具中自动设置它,而无需使用映射文件来设置顺序
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity.ModelConfiguration;
namespace YourNamespace.Mapping
{
public class DataObject1Map : EntityTypeConfiguration<DataObject1>
{
public DataObject1Map()
{
// Primary Key
this.HasKey(t => t.Id);
// Properties
this.Property(t => t.Name)
.HasMaxLength(128);
this.Property(t => t.SomeProperty)
.IsRequired()
.HasMaxLength(32);
// Table & Column Mappings
this.ToTable("DataObject1");
this.Property(t => t.Id).HasColumnName("Id");
this.Property(t => t.Name).HasColumnName("Name");
this.Property(t => t.SomeProperty).HasColumnName("SomeProperty");
}
}
}
//In your context class
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Configurations.Add(new DataObject1Map());
base.OnModelCreating(modelBuilder);
}
使用System.ComponentModel.DataAnnotations.Schema;
使用System.Data.Entity.ModelConfiguration;
名称空间YourNamespace.Mapping
{
公共类DataObject1Map:EntityTypeConfiguration
{
公共DataObject1Map()
{
//主键
this.HasKey(t=>t.Id);
//性质
this.Property(t=>t.Name)
.HasMaxLength(128);
this.Property(t=>t.SomeProperty)
.IsRequired()
.HasMaxLength(32);
//表和列映射
本表为ToTable(“DataObject1”);
this.Property(t=>t.Id).HasColumnName(“Id”);
this.Property(t=>t.Name).HasColumnName(“Name”);
this.Property(t=>t.SomeProperty).HasColumnName(“SomeProperty”);
}
}
}
//在你的课堂上
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove();
添加(新的DataObject1Map());
基于模型创建(modelBuilder);
}
当我不得不创建复合键时,我偶然发现了一些东西。似乎可以使用列属性属性中的Order属性来确保生成表中的特定顺序
下面是我如何修改BaseDataObject的
public abstract class BaseDataObject
{
[Key, Column(Order = 0)]
public Guid Id {get; set;}
[Column(Order = 1)]
public string Name {get; set;}
}
这可确保名称列位于生成的表中的第二个位置,位于DataObject1和DataObject2的任何属性之后。是否使用迁移?这在具有两个级别的层次结构时似乎有效。我的有3个,EF将等级最高的属性放在最新的位置。。。我尝试了同样的方法,但没有成功。