2016-04-18 18 views
0

どのように私は、エンティティFramewrokコードファーストでこのシナリオをモデル化することができます。デザイン複数のエンティティのための一般的なモデル

| Id | Name | 
|----|-------| 
| 1| Cat1| 
| 2| Cat2| 
| 3| Cat3| 

| Id | Name | 
|----|-------| 
| 1 | Dog1| 
| 2 | Dog2| 
| 3 | Dog3| 

オーナー

| Id | Name |TableName |EntityId| 
|----|-------|-------------------- 
| 1 | John| Dog |  1| 
| 2 | Pete| Cat |  1| 
| 3 |Jessica| Cat |  2| 

これは、私が達成したいことの単なる例です。私はその所有者テーブルには動物を保管することができます、私は動物のテーブルをコントロールすることはできませんので、猫と犬に加えて、マウス、ライオンなどがあるかもしれません。

Entity Frameworkはこれをサポートしていますか?これをナビゲーションプロパティでモデル化できますか?

私は階層ごとのテーブルについて読みましたが、このアプローチに従うべきではないと思います。また、私はオーナーテーブルから任意の動物エンティティに移動したいと思います。

+0

を試してみましたか?ちなみにTPHは答えです;-) – CodeNotFound

答えて

0

あなたのテーブルと完全に互換性があり、新しい動物で別のテーブルを追加する場合は、Ownerクラスで変更する必要はありません。希望。

MODELS:

public class Animal 
{ 
    public int Id { get; set; } 
    [StringLength(64)] 
    public string Name { get; set; } 
} 

public class Dog : Animal 
{ 
} 

public class Cat : Animal 
{ 
} 

public class Owner 
{ 
    public int Id { get; set; } 
    [StringLength(64)] 
    public string Name { get; set; } 

    [StringLength(64)] 
    public string TableName { get; private set; } 
    public int? EntityId { get; private set; } 

    [NotMapped] 
    public Animal animal { 
     get { 
      if (EntityId == null || string.IsNullOrEmpty(TableName)) 
       return null; 

      using (var context = new Context()) 
      {      
       var type = typeof(Animal).Assembly.GetTypes().Where(x => x.Name.Contains(TableName)).First(); 
       return (Animal)context.Set(type).Find(EntityId);           
      } 
     } 
     set { 
      //I assume that animal has already existed on this moment i.e. Id field is valid. 
      EntityId = value.Id; 
      TableName = value.GetType().Name; 
     } 
    } 
} 

IMPLEMENTATION:あなたは何を

var cat = context.Cats.Add(new Cat { Name = "Cat1" }); 
context.SaveChanges(); 

var owner = context.Owners.Add(new Owner { Name = "Owner", animal = cat }); 
context.SaveChanges(); 

var animal = owner.animal; 
+0

私は実際の世界のようにAnimalからOwnerを継承する必要はないと思います(少なくとも私たちの日では)。 – Mardok

+0

それはヒントではなく、ただOOPです。 –

関連する問題