2016-09-30 7 views
0

私はEF CodeFirstで新しいデータベースをモデリングしています。Entity Framework:基本構成クラスから継承することは可能ですか?

public abstract class Entity 
{ 
    public Guid Id { get; set; } 
    public byte [] TimeStamp { get; set; } 
} 

そして、そこのようなクラスがたくさん:FluentAPIに基づいて

public class Country : Entity 
{ 
    public string Name { get; set; } 
    public string InternationalCode { get; set; } 
    public Location Location { get; set; } 
    public ICollection<City> Cities { get; set; } 

    public Country(string name, string internationalCode, decimal latitude, decimal longitude) 
     : this(name, internationalCode) 
    { 
     Location.Latitude = latitude; 
     Location.Longitude = longitude; 
    } 
    public Country(string name, string internationalCode) : this() 
    { 
     Name = name; 
     InternationalCode = internationalCode; 
    } 

    public Country() 
    { 
     Location = new Location(); 
     Cities = new List<City>(); 
    } 
} 

そして、すべてのモデルのコンフィギュレーション:

public CountryConfiguration() 
    { 
     HasKey(p => p.Id); 
     Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
     Property(p => p.TimeStamp).IsRowVersion(); 

     Property(p => p.Name).IsRequired().HasMaxLength(100); 
     Property(p => p.InternationalCode).IsRequired().HasMaxLength(5); 

     HasMany(p => p.Cities) 
      .WithOptional(p => p.BelongedCountry) 
      .HasForeignKey(p => p.BelongedCountryId); 
    } 
ここで私は、抽象基底クラスと、このクラスから継承されたすべてのドメインモデルを持っています

問題は、

 HasKey(p => p.Id); 
     Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
     Property(p => p.TimeStamp).IsRowVersion(); 

この部分は、ドメインモデルごとに30回以上コピーされています。コンフィグレーションクラスをから継承する方法はありますか?EntityTypeConfigurationだけでなく、継承\にはエンティティコンフィグレーションのコンフィグレーションが含まれていますか?

public class EntityConfiguration : EntityTypeConfiguration<Entity> 
{ 
    public EntityConfiguration() 
    { 
     HasKey(p => p.Id); 
     Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
     Property(p => p.TimeStamp).IsRowVersion(); 
    } 
} 

私は知っている、そのC#は複数の継承を許可していません。何をお勧めしますか?

答えて

3

私が何かが欠けていない限り、抽象クラスを使用できませんか?ちょうどあなたのスニペットを見てから

public abstract class BaseEntityConfiguration<T> : EntityTypeConfiguration<T> where T : Entity 
{ 
    protected BaseEntityConfiguration() 
    { 
     HasKey(p => p.Id); 
     Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
     Property(p => p.TimeStamp).IsRowVersion(); 
    } 
} 

public class CountryConfiguration : BaseEntityConfiguration<Country> 
{} 
1

、と私はあなたの要件を満たすために、それを構造化することができるか、私はそうのようなあなたのEntityConfigurationクラスを変更することがあります

public class EntityConfiguration<TEntityType> : EntityTypeConfiguration<TEntityType> where TEntityType : Entity 
{ 
    public EntityConfiguration() 
    { 
    HasKey(p => p.Id); 
    Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
    Property(p => p.TimeStamp).IsRowVersion(); 
    } 
} 

次に、あなたのような継承された設定を、作成することができますあなたのCountryConfiguration:

public class CountryConfiguration : EntityConfiguration<Country> 
{ 
    public CountryConfiguration() : base() 
    { 
    Property(p => p.Name).IsRequired().HasMaxLength(100); 
    Property(p => p.InternationalCode).IsRequired().HasMaxLength(5); 
    } 
} 

お使いのベースのエンティティタイプにwhere句でEntityConfigurationクラスにジェネリック型を制限することにより、あなたは番目で作業できるようになりますEntityConfigurationクラスのベースプロパティを変更し、残りは特定のモデルの派生クラスに残ります。

0

@mxmissileと@Jodacolaが提供する解決策を感謝します。私が探していたものを正確に実行しました。

modelBuilder.Entity<Entity>().HasKey(p => p.Id); 
     modelBuilder.Entity<Entity>().Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
     modelBuilder.Entity<Entity>().Property(p => p.TimeStamp).IsRowVersion(); 

     modelBuilder.Configurations.Add(new CountryConfiguration()); 
     modelBuilder.Configurations.Add(new CityConfiguration()); 
     modelBuilder.Configurations.Add(new LocationConfiguration()); 
     modelBuilder.ComplexType<Location>(); 

それは「適切でない」ソリューションであると私は学術目的でそれを公開:

は、私はちょうど私が私が尋ねた何をすべきか、別の「バグ」の道を見つけたことを追加したいです。 何らかの理由で、データベースにテーブル「エンティティ」が作成されました。私はあなたが説明することができれば、なぜここでテーブルの "エンティティ"をデータベースで作成したのか、非常に感謝していますか?

dbには、Entityクラスから継承したすべてのエンティティのすべてのIdのコピーが含まれています。

+0

これについて新しい質問をする必要があります。しかし、そのコードの最初の3行は必要ありません。あなたのconfigクラスは基本設定クラスから継承しているので。 – mxmissile

+0

@mxmissile、nope、ここでは継承を適用​​しないで "普通の"設定クラスを使用します。私はあなたのアドバイスに従い、別の質問をします。 –

関連する問題