2017-09-28 11 views
0

に私はこのモデルを達成したい: enter image description here enter image description hereEntity Frameworkのコード:1-ゼロ、1対または会合派生オブジェクト

私は多くの方法をしようとしてきたが、何も動作。たとえば、コードは次のようになります。

public class MyContext : DbContext 
{ 
    public DbSet<Animal> Animals { get; set; } 
    public DbSet<Cage> Cages { get; set; } 
} 

public class Cage 
{ 
    public int CageID { get; set; } 
    public Bird Bird { get; set; } 
} 

public abstract class Animal 
{ 
    public int AnimalID { get; set; } 
    public string Name { get; set; } 
} 

public class Bird : Animal 
{ 
    [ForeignKey("Cage")] 
    public int CageID { get; set; } 
    public Cage Cage { get; set; } 
} 

public class Shark : Animal 
{ 
    public int AquariumID { get; set; } 
} 

ありがとうございました。

答えて

0

あなたが探しているものは、テーブルごとのタイプと呼ばれます。

あなたは、この2つの方法を行うことができますが、最初の方法は、あなたが動物から鳥へのキー値を移動流暢API

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Bird>().ToTable("Bird"); 
    modelBuilder.Entity<Shark>().ToTable("Shark"); 
} 
0

を行うと、好むあなたのShark

または場合も同様に、データの注釈[Table("Bird")]を使用することです鮫。

public abstract class Animal 
{ 
    public string Name { get; set; } 
    public int? CageID { get; set; } 
    [ForeignKey("CageID")] 
    public virtual Cage Cage { get; set; } 
} 

public class Bird : Animal 
{ 
    [Key] 
    public int ID { get; set; } 
    public bool CanFly { get; set; } 
} 

public class Shark : Animal 
{ 
    [Key] 
    public int ID { get; set; } 

    public bool CanSwim { get; set; } 
} 

この場合、次のような結果がデータベースに表示されます。

enter image description here

は、それはあなたに助けを願っています。

+0

それから私は、エラー 'EntityType「アニマル」は何のキー定義されていません取得します。このEntityTypeのキーを定義します.'私のコードスニペットで何か他のものを変更しましたか? – Feofilakt

+0

@Feofilakt今、Animal abstractクラスを追加しました。もう一度やってみてください。 – arslanaybars

+0

いいえ、考え方は、どの動物にもCageプロパティがないことです。たとえば、サメはケージではなく、アクアリウム – Feofilakt

0

私はあなたを正しく理解していますが、「仮想」文を試したことがありますか分かりませんか?

public class Bird : Animal 
{ 
    public virtual Cage cage{ get; set; } 
} 

これはEntityFrameworkがあなたのためにすべての作業を行うために原因遅延ロードできます:IDを生成するあなたの方法について

Bird Polly = new Bird{cage = new Cage()}; 

わからないが、「ID」フィールドに[DatabaseGenerated(DatabaseGeneratedOption.Identity)]を追加する必要があります。

0

Bird.CageIdがBirdのキーではないため、Cageは単一のBirdを参照できないという問題があります。だから1対多の関係として宣言することができますが、Bird.CageIdには一意的な制約を設定して、実際に同じ檻に2匹の鳥を入れることはできません。

public class MyContext : DbContext 
    { 
     public DbSet<Animal> Animals { get; set; } 
     public DbSet<Cage> Cages { get; set; } 
    } 

    public class Cage 
    { 
     public int CageID { get; set; } 
     public virtual ICollection<Bird> Birds { get; set; } 
    } 

    public abstract class Animal 
    { 
     public int AnimalID { get; set; } 
     public string Name { get; set; } 
    } 

    public class Bird : Animal 
    { 
     [ForeignKey("Cage"),Index(IsUnique =true)] 
     public int CageID { get; set; } 
     public Cage Cage { get; set; } 
    } 

    public class Shark : Animal 
    { 
     public int AquariumID { get; set; } 
    } 

別のオプションは、ケージの外部キーを置くことです:このよう

public class MyContext : DbContext 
    { 
     public DbSet<Animal> Animals { get; set; } 
     public DbSet<Cage> Cages { get; set; } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      base.OnModelCreating(modelBuilder); 

      modelBuilder.Entity<Bird>().HasOptional(b => b.Cage).WithRequired(c => c.Bird); 
     } 
    } 

    public class Cage 
    { 
     [Key] 
     public int CageId { get; set; } 


     [ForeignKey("CageId")] 
     public virtual Bird Bird { get; set; } 
    } 

    public abstract class Animal 
    { 
     public int AnimalID { get; set; } 
     public string Name { get; set; } 
    } 

    public class Bird : Animal 
    { 
     public Cage Cage { get; set; } 
    } 

    public class Shark : Animal 
    { 
     public int AquariumID { get; set; } 
    } 
+0

そして、毎回 'cage.Birds.First()'と書かなければならず、それはコレクションの1つの項目であることに留意してください。それは良く見えません。 – Feofilakt

+0

別のオプションが追加されました。 –

+0

この場合、私は関連「ケージ:0..1 - バード:1」が必要ですが、私はケージ:1-バード:0..1 – Feofilakt

関連する問題