实体框架代码在生成的表中首先继承属性顺序

时间:2015-07-29 09:14:12

标签: 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; 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在生成表格时这样做?我知道它只是化妆品,但仍然......如果有人直接看看数据库,那么最后那些“基本属性”似乎相当混乱。

感谢。

2 个答案:

答案 0 :(得分:2)

当我不得不创建复合键时,我偶然发现了一些东西。看来Column属性属性中的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的任何属性之后,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);
}