2013-11-12 7 views
0

У меня есть 2 класса, тип A имеет один экземпляр типа B, а также набор типа B. Я пробовал различные конфигурации, но я не могу заставить его работайте правильно. Если бы вы могли объяснить мне, что я делаю неправильно, или дать мне ресурс, который будет полезен. Я улучшаюсь с этими сопоставлениями, но время от времени они выходят за пределы моего понимания. Я ограничил свои классы только важными свойствами.Свободная конфигурация для коллекции и одного свойства того же типа

Разъяснение

Там будет только когда-либо один тотализаторы, связанные с заявителем, заявитель, хотя будет находиться в коллекции заявителей, и выигрышная запись будет иметь идентификатор заполняемый в поле WinnerId, который я надеялся, что EF отобразит правильного заявителя.

Ошибка

Навигационное свойство «Тотализаторы» объявил о типе «NPlay.Common.Models.SweepstakesApplicant» был настроен с противоречивой информацией отображения.

Классы

public SweepstakesConfiguration() 
{ 
    Property(c => c.Id).HasColumnName("SweepstakesId"); 

    HasMany(c => c.Applicants) 
     .WithRequired(c => c.Sweepstakes) 
     .HasForeignKey(c => c.SweepstakesId); 

    HasOptional(c => c.WinningApplicant) 
     .WithRequired(c => c.Sweepstakes) 
     .Map(c => c.MapKey("WinnerId")); 
} 

public class SweepstakesApplicant 
{ 
    public long Id { get; set; }   
    public int SweepstakesId { get; set; } 
    public virtual Sweepstakes Sweepstakes { get; set; } 
    public int BuyerId { get; set; } 
    public virtual Buyer Buyer { get; set; } 
    public int AgentId { get; set; } 
    public virtual Agent Agent { get; set; } 
} 

Отображения

public SweepstakesConfiguration() 
{ 
    Property(c => c.Id).HasColumnName("SweepstakesId"); 

    HasOptional(c => c.WinningApplicant) 
     .WithRequired(c => c.Sweepstakes) 
     .Map(c => c.MapKey("WinnerId")); 
} 

public SweepstakesApplicantConfiguration() 
{ 
    Property(a => a.Id).HasColumnName("SweepstakesApplicantId"); 

    HasRequired(a => a.Sweepstakes) 
      .WithMany(s => s.Applicants) 
      .HasForeignKey(a => a.SweepstakesId) 
      .WillCascadeOnDelete(); 

    HasRequired(c => c.Sweepstakes) 
     .WithOptional(c => c.WinningApplicant) 
     .Map(c => c.MapKey("SweepstakesId")); 

    HasRequired(a => a.Buyer) 
     .WithMany(b => b.SweepstakesApplications) 
     .HasForeignKey(a => a.BuyerId); 

    HasRequired(a => a.Agent) 
     .WithMany() 
     .HasForeignKey(a => a.AgentId); 
} 

Edit: Обновление отображения конфигурации и ошибок. Редактировать: Исправлен заголовок, поразительно, сколько исправлений я получил. Интересно, будет ли этот сайт лучше, если люди больше времени будут отвечать на вопросы, а затем просто идут по редактированию: D, хм, это, вероятно, тоже будет отредактировано.

+0

Возможно, я ошибаюсь, но я думаю, что там есть круговая зависимость, это может быть проблемой. – Rafa

+0

Поначалу кажется, что так, но вот как вы настраиваете свойства навигации. Модели сами по себе твердые, я уверен, это всего лишь картография. Я думаю, что проблема заключается в том, что у меня есть один заявитель, а также их коллекция. Мне, вероятно, нужна другая настройка сопоставления, которую я потерял или неправильно сконфигурировал. – Tony

+0

ОК, извините, в этом случае я не могу вам помочь, у меня не так много опыта работы с кодом :( – Rafa

ответ

0

Это конфигурация, в которой я оказался.

public SweepstakesConfiguration() 
    { 
     Property(c => c.Id).HasColumnName("SweepstakesId"); 

     HasOptional(c => c.WinningApplicant) 
      .WithMany() 
      .HasForeignKey(c => c.WinnerId); 
    } 

    public SweepstakesApplicantConfiguration() 
    { 
     Property(a => a.Id).HasColumnName("SweepstakesApplicantId"); 

     HasRequired(a => a.Sweepstakes) 
      .WithMany(s => s.Applicants) 
      .HasForeignKey(a => a.SweepstakesId) 
      .WillCascadeOnDelete(); 

     HasRequired(a => a.Buyer) 
      .WithMany(b => b.SweepstakesApplications) 
      .HasForeignKey(a => a.BuyerId); 

     HasRequired(a => a.Agent) 
      .WithMany() 
      .HasForeignKey(a => a.AgentId); 
    } 
0

Вы используете тот же внешний ключ (SweepstakesId) как у one to zero-or-one, так и для one-to-many отношений.

Либо создайте коллекцию на SweepstakesApplicant под названием WinnerOfSweepstakes, либо аналогично и скажите hasMany или удалите свойство навигации из сопоставления.

+0

Прошу прощения, но я не преследую вас. У меня есть группа претендентов. только один претендент, который выиграл. Это та же модель, поэтому он будет использовать тот же ключ, моя модель лотереи имеет WinnerId, которая является FK, чтобы связать ее, в то время как сбор является навигационным свойством для заявителей, которые ввели. – Tony

+0

Я добавлю, на SweepstakesConfig, я добавил, что HasMany (c => c.Applicants) добавляет попытку заставить это работать, но может быть совершенно неправильно, будучи там. Независимо от того, что он не будет работать с или без, и дает такую ​​же ошибку. – Tony

Смежные вопросы