2016-10-09 73 views
2

嘗試設置基本EF6可選1:1。非常令人沮喪。我讀了很多,失去了職位。EF6可選1:1包括不工作

我有兩個實體,客人和座位,每個人都可以獨立存在,座位不需要客人,客人也不需要座位。

遊客型號:

 public int ID { get; set; } 

     public int? SeatID { get; set; } 

     [Required] 
     public string FirstName { get; set; } 

     //Link to Seat 
     public Seat Seat { get; set; } 

座椅型號:

 public int ID { get; set; } 

     public int? GuestID { get; set; } 

     [Required] 
     public string SeatNumber { get; set; } 

     public bool Occupied { get { return (GuestID == null ? true : false); } } 

     //Link to Guest 
     public Guest Guest{ get; set; } 

我有很多剛開到這一點問題。我不得不把它添加到我的模型創建的關係的工作:

 modelBuilder.Entity<Seat>() 
      .HasOptional(g => g.Guest) 
      .WithOptionalDependent(s => s.Seat); 

現在,當我嘗試與包括法負載相關的數據,它只是出現空白,什麼都沒有我的應用程序工作。然而。

var seats = db.Seats.Include(s => s.Guest); 
      return View(seats.ToList()); 

在我看來,我用

@Html.DisplayFor(modelItem => item.Guest.FirstName) 

我想知道如何使include語句的工作,最好不懶加載(或甚至如果我要)。另外,我不想擁有SeatAssignment表,我考慮走這條路。

我可以使用Viewmodel爲此工作,但我不明白爲什麼1:1可選不加載相關數據。

按照要求,這裏是生成的模式...絕對是奇怪的事情在這裏。作爲一個旁註,我可以使它與視圖模型一起工作,但我不想。

Schema

+1

您可以顯示不同genretaed表的模式? – CodeNotFound

+0

添加到我的問題,現在我知道它爲什麼不起作用,但我更困惑,如何生成。 – dave317

回答

1

你有如下來構建你的模型。

public class Guest 
{ 
     public int GuestId { get; set; } 

     [Required] 
     public string FirstName { get; set; } 

     //Link to Seat 
     public virtual Seat Seat { get; set; } 
} 

public class Seat 
{ 
     public int SeatId { get; set; } 

     [Required] 
     public string SeatNumber { get; set; } 

     public bool Occupied { get { return (GuestID == null ? true : false); }} 

     //Link to Guest 
     public virtual Guest Guest{ get; set; } 
} 

流利的API映射:

modelBuilder.Entity<Seat>() 
      .HasOptional(g => g.Guest) 
      .WithOptionalDependent(s => s.Seat); 

然後:

var seats = db.Seats.Include(s => s.Guest).ToList(); 
+0

我將此標記爲正確,因爲它更接近我用於解決方案的內容。這兩個答案都無法完成我想要做的事情。包含聲明仍然不適用於此解決方案。我使用Viewmodel來顯示應該使用include語句的相關信息。感謝您的建議先生們,我能夠做出一些工作。這兩種解決方案都是以自己的方式正確的 – dave317

+0

你熱烈歡迎:)希望你可以把你自己的答案呢? – Sampath

1

1-0..1關係配置是你所希望的方式不同。 X和Y之間

  1. 1-0..1關係船舶意味着XID是在X主鍵,也XID也是Y中的主鍵也是外鍵
  2. 你所請求的是MN關係其中m = 1和n = 1,因此配置應該不同。

根據上述規則,你的代碼應該如下

客戶類

public class Guest 
{ 
    public int ID { get; set; } 
    [Required] 
    public string FirstName { get; set; } 

    public IList<Seat> Seats { get; set; } 
} 

座級

public class Seat 
{ 
    public int ID { get; set; } 
    [Required] 
    public string SeatNumber{ get; set; } 

    public IList<Guest> Guests { get; set; } 
} 

加入表

public GuestSeat 
{ 
    public int GuestID{get;set;} 
    public int SeatID{get;set;} 

    public DateTime ReservedDate{get;set;} 
    // other fields goes here 
} 

配置

modelBuilder.Entity<GuestSeat>() 
      .HasKey(gs => new {gs.GuestID,gs.SeatID}) 
      .ToTable("GuestSeats"); 
modelBuilder.Entity<GuestSeat>() 
      .HasRequired(g=>g.Guest) 
      .WithMany(g=>g.Seats) 
      .HasForeignKey(gs =>gs.GuestID) 
      .DeleteOnCascade(false); 
modelBuilder.Entity<GuestSeat>() 
      .HasRequired(s=>s.Seat) 
      .WithMany(s=>s.Guests) 
      .HasForeignKey(gs =>gs.SeatID) 
      .DeleteOnCascade(false); 

該解決方案提供了以下

  1. 作爲嘉賓,在今天的活動,我可以預留座位A,和明天的活動,我可以保留座椅B.
  2. 座位A可以由客人X佔用,明天由客人Y佔用
  3. 爲確保某個人在某一日期可以佔用座位,您可以在SeatIDReservedDate上創建唯一索引。

希望這將幫助你

+0

這兩個答案都可以工作......但是這兩個答案都不能完全實現我正在嘗試做的事情,也沒有使包含聲明工作。 – dave317