2016-10-09 6 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; } 

Seat Модель:

 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) 

Я хочу знать, как сделать работу включать заявление, предпочтительно без отложенной загрузки (или даже с если я должен). Кроме того, я не хочу иметь таблицу SeatAssignment, я подумал о том, чтобы пойти по этой дороге.

Я мог бы использовать Viewmodel для этого, чтобы работать, но я не понимаю, почему опция 1: 1 не загружает связанные данные.

Как запрошено, вот сгенерированная схема ... определенно что-то странное происходит здесь. В качестве побочного примечания я могу заставить его работать с viewmodel, но я этого не хочу.

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; } 
} 

Fluent отображение API:

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

Тогда:

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

Я отметил это правильно, потому что он ближе к тому, что я использовал для своего решения. Ни один ответ не выполняет именно то, что я хочу сделать. Оператор include все еще не работает с этим решением. Я использовал Viewmodel для отображения связанной информации, которая ДОЛЖНА работать с оператором include. Спасибо за ваши предложения, господа, я смог что-то сделать. Оба решения правильны по-своему – dave317

+0

, вы тепло приветствуете :) Надеюсь, вы можете надеть свой собственный ответ? – Sampath

1

1-0..1 конфигурация отношения отличается от того, что вы хотите.

  1. 1-0..1 отношение корабль между X и Y означает, что Xid является первичным ключом в X, а также Xid также первичный ключ в Y, а также внешний ключ
  2. Что вы запрашиваете взаимосвязь млн с 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. в качестве гостя, на сегодняшнем мероприятии, я могу зарезервировать сиденье, а завтра событие, я могу забронировать сиденье B.
  2. Место А может быть занято гостем X и завтра гостем Y
  3. Для обеспечения того, чтобы сиденье было занято одним человеком на определенную дату, вы можете создать уникальный индекс на SeatID и ReservedDate.

Надеется, что это поможет вам

+0

Оба ответа будут работать ... но ни то, ни другое не выполняет точно то, что я пытаюсь сделать, и не делает работу оператора include. – dave317