2017-09-28 62 views
0

我要完成這個模型: enter image description here enter image description here實體框架代碼首先:一到一或零協會派生類對象

我一直在努力的方法很多,但沒有任何工程。那是,例如,我認爲應該是代碼:

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

您要找的內容稱爲Table Per Type。

你可以這樣做2種方式,第一種方式是通過使用數據標註[Table("Bird")]同樣爲您Shark

或者如果你喜歡做流利的API

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

移動鍵值從動物到鳥類和鯊魚。

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我現在添加了動物抽象類。你可以再試一次嗎? – arslanaybars

+0

不,這個想法是沒有任何動物擁有凱奇的財產。例如,鯊魚不在籠子裏,但在水族館 – Feofilakt

0

不知道我是否正確理解你,但你有沒有嘗試過「虛擬」陳述?

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

這使得延遲加載導致的EntityFramework做所有的工作你:

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

不確定您生成ID的方式,可能有添加[DatabaseGenerated(DatabaseGeneratedOption.Identity)]的「ID」字段。

0

問題在於Cage無法引用單個Bird,因爲Bird.CageId不是Bird的關鍵。所以你可以聲明它爲一對多的關係,但是在Bird.CageId上設置了一個唯一的約束,所以沒有兩隻鳥實際上可以在同一個籠中。就像這樣:

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()',並且要記住它只是一個集合中的一個項目。它看起來不太好。 – Feofilakt

+0

增加了另一個選項。 –

+0

在這種情況下,我得到關聯'籠:0..1 - 鳥:1',但我需要'籠:1 - 鳥:0..1' – Feofilakt

相關問題