我首先做代码,因为我的许多POCO对象共享一些属性,所以我决定用继承来设置东西。这是我的两个数据对象
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生成我的表,它将创建两个具有以下属性的表
DataObject1 Id(uniqueidentifier,PK) SomeProperty(nvarchar(max)) 名称(nvarchar(max))
DataObject2 Id(uniqueidentifier,PK) OtherProperty(nvarchar(max)) 名称(nvarchar(max))
所以它把键放在第一位..但我的BaseDataObject的另一个属性在最后添加。我宁愿在Id之后立即拥有这些属性。所以首先是BaseDataObject的属性,然后是派生对象的属性。
有没有办法告诉EF在生成表格时这样做?我知道它只是化妆品,但仍然......如果有人直接看看数据库,那么最后那些“基本属性”似乎相当混乱。
感谢。
答案 0 :(得分:2)
以下是我修改BaseDataObject的方法
public abstract class BaseDataObject
{
[Key, Column(Order = 0)]
public Guid Id {get; set;}
[Column(Order = 1)]
public string Name {get; set;}
}
这确保在DataObject1和DataObject2的任何属性之后,Name列位于生成的表中的第二个位置。
答案 1 :(得分:0)
您可以使用映射文件执行此操作。运行迁移时,它将按该顺序构建表。这将需要每个实体的映射文件。我不知道如何在迁移工具中自动设置它,而无需使用映射文件来设置顺序。
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);
}