Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 实体框架代码生成表中的第一个继承属性顺序_Entity Framework_Inheritance_Ef Code First - Fatal编程技术网

Entity framework 实体框架代码生成表中的第一个继承属性顺序

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

我先编写代码,因为我的许多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生成我的表,它将创建两个具有以下属性的表

数据对象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将等级最高的属性放在最新的位置。。。我尝试了同样的方法,但没有成功。