2012-08-25 107 views
4

我想要一個展位(在展會上)和參展商名單的清單。MVC EF代碼首先一對一的關係錯誤

展位清單與參展商名單分開 - 但是,一旦註冊,我希望參展商能夠預定展位。

當他們選擇/預訂展位時,我希望能夠在展位中列出我的展位,並且還會向參展商預訂展位。

同樣,我想以另一種觀點列出參展商,以及他們預訂的展位。

所以我試圖建立一對一的關係(使用EF CodeFirst)。

但是,嘗試添加一個控制器,無論是展位還是參展商的時候,我得到以下錯誤:

enter image description here

我的車型有:

public class Stand 
{ 
    public int StandID { get; set; } 
    public string Description { get; set; } 
    public bool Booked { get; set; } 
    public int ExhibitorID { get; set; } 
    public virtual Exhibitor Exhibitor { get; set; } 

} 

public class Exhibitor 
{ 
    public int ExhibitorID { get; set; } 
    public string Company { get; set; } 
    public int StandID { get; set; } 
    public virtual Stand Stand { get; set; } 

} 

我敢肯定這與模型的「虛擬」部分有關。

任何人都可以請幫忙指出應該更新什麼,以允許連接?

謝謝

馬克

回答

5

EF不知道哪個實體是主體(父),哪個是從屬(子)。您需要在應該先到達的實體項目上聲明外鍵。您可以使用註釋或流暢的映射來做到這一點。

註釋

添加以下命名空間:

using System.ComponentModel.DataAnnotations.Schema; 

標註您Stand類以下注釋:

public class Stand 
{ 
    [ForeignKey("Exhibitor")] 
    public int StandID { get; set; } 
    public string Description { get; set; } 
    public bool Booked { get; set; } 
    public int ExhibitorID { get; set; } 
    public virtual Exhibitor Exhibitor { get; set; } 

} 

流利的映射

覆蓋您OnModelCreating方法在DbContext類包括:

modelBuilder.Entity<Stand>() 
    .HasOptional(s => s.Exhibitor) 
    .WithRequired(e => e.Stand); 
3

您創建的模型是不可能的關係數據庫工作。 Stand需要ExibitorId,而Exibitor需要StandId。循環關係不允許您將任何行插入到任何表中。

假設Exibitor可能有多個Stand並將關係轉換爲一對多是一種選擇。

public class Stand 
{ 
    public int StandID { get; set; } 
    public string Description { get; set; } 
    public bool Booked { get; set; } 
    public int? ExhibitorID { get; set; } 
    public virtual Exhibitor Exhibitor { get; set; }  
} 

public class Exhibitor 
{ 
    public int ExhibitorID { get; set; } 
    public string Company { get; set; } 
    public virtual ICollection<Stand> Stands { get; set; } 
} 

或者您可以使用共享主鍵映射,使關係一個對一個。其中Stand是主要實體。 Exibitor將使用StandID作爲其PK。

public class Stand 
{ 
    public int StandID { get; set; } 
    public string Description { get; set; } 
    public bool Booked { get; set; } 
    public virtual Exhibitor Exhibitor { get; set; } 
} 

public class Exhibitor 
{ 
    public int ExhibitorID { get; set; } 
    public string Company { get; set; } 
    public virtual Stand Stand { get; set; } 
} 

使用Fluent API配置關係。

modelBuilder.Entity<Exibitor>().HasRequired(e => e.Stand) 
    .WithOptional(s => s.Exibitor);