2015-07-29 1 views
1

Я делаю код первым, и поскольку многие из моих объектов 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 (макс)) Имя (NVARCHAR (макс))

DataObject2 Id (UniqueIdentifier, ПК) OtherProperty (NVARCHAR (макс)) Имя (NVARCHAR (макс))

Итак, он ставит ключ первым .., но другое свойство моего BaseDataObject добавляется в конец. Я бы предпочел бы иметь эти свойства сразу после Id .. так что сначала свойства BaseDataObject, затем свойства производных объектов.

Есть ли способ сказать EF сделать это при создании моих таблиц? Я знаю, что это просто косметика, но все же ... если кто-то смотрит на БД напрямую, то наличие этих «базовых свойств» в конце кажется довольно запутанным.

Спасибо.

+0

Вы используете миграцию? –

ответ

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); 
} 
2

Я наткнулся на что-то, когда мне пришлось создавать составные клавиши. что атрибут Order в атрибуте свойства Column может использоваться для обеспечения определенного порядка в сгенерированной таблице.

Вот как я изменил мой BaseDataObject

public abstract class BaseDataObject 
{ 
    [Key, Column(Order = 0)] 
    public Guid Id {get; set;} 

    [Column(Order = 1)] 
    public string Name {get; set;} 
} 

Это гарантирует, что столбец Name находится на второй позиции в сгенерированной таблицы, после каких-либо свойств DataObject1 и DataObject2.

+0

Это похоже на работу с иерархией из двух уровней. Mine имеет 3, и EF ставит свойства самого высокого класса в hiearchy на последних позициях ... Я пробовал этот же подход без везения. –

Смежные вопросы