2015-07-19 2 views
1

У меня есть два объекта в моих классах Entity Framework POCO называемой шлюпка и ПрицельнаяEntity Framework отношение 0..1 с 1 .. * ссылки назад

Прицельные имеют 1 .. * отношения с Спасательной шлюпкой, и это, кажется, работает штраф (с таблицей ссылок на SightingLifeboats

я теперь также необходим поддержать ссылку, что отношения так мне нужна ссылка с Спасательной шлюпки для прицельного, который будет 0 .. *

Я попытался сделать обратное и попытался делая один виртуальный, но это не сработало, может быть, мне нужно более свободное кодирование?

Мои шлюпка Класс:

public class Lifeboat : EntityBase 
{ 
    public Lifeboat() 
    { 
     Sightings = new List<Sighting>(); 
    } 

    public string CurrentName { get; set; } 

    //A Lifeboat Ownes 0:* Sightings 
    public List<Sighting> Sightings { get; set; } 
    //public virtual Sighting Sightings { get; set; } 

    //Called from Context Class OnModelCreating 
    public static void LifeboatEntityConfiguration(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Lifeboat>().HasMany(x => x.Sightings).WithMany(); 
    } 
} 

И Прицельная Класс

public class Sighting : EntityBase 
{ 
    public Sighting() 
    { 
     Lifeboats = new List<Lifeboat>(); 
     TimeSeen = DateTime.Now.Date; 
    } 

    public string Location { get; set; } 

    //A Sighting has 1..* Lifeboats (Not Owned) 
    public List<Lifeboat> Lifeboats { get; set; } 
    //public virtual Lifeboat Lifeboat { get; set; } 

    public static void SightingEntityConfiguration(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Sighting>().HasMany(x => x.Lifeboats).WithMany(); 
    } 

}

ответ

2

Это не правильный способ настроить многие ко многим отношений между Lifeboat и Sighting. Если вы удалите конфигурации Fluent Api, которые у вас уже есть, по умолчанию EF создаст третью таблицу соединения, SightingLifeboats, которая будет состоять из ПК обеих таблиц. Это связано с тем, что у вас есть свойство навигации для коллекции в каждом объекте. Но вы можете настроить явно эти отношения с помощью Fluent Апи:

modelBuilder.Entity<LifeBoat>() 
      .HasMany<Sighting >(l => l.Sightings) 
      .WithMany(s => s.LifeBoats) 
      .Map(cs => 
         { 
         cs.MapLeftKey("LifeBoatRefId"); 
         cs.MapRightKey("SightingId"); 
         cs.ToTable("SightingLifeboats"); 
         }); 

Таким образом, вы можете изменить имя таблицы перехода и указать имена свойств FK, в случае, если вам нужно изменить их.

Другое дело, я рекомендую, чтобы изменить свойства инкассации virtual .Если вы сделаете все ваши свойства virtual то EF будет генерировать прокси-классы во время выполнения, производный из классов POCO, эти прокси позволяют EF, чтобы узнать об изменениях в режиме реального вместо того, чтобы захватывать исходные значения вашего объекта, а затем сканировать изменения при сохранении.

+0

Thats work thanks, я реализовал Lifeboat -> Сначала прицелился, чтобы получить и запустить (что нужно было немного свободно). Я думаю, что попытался удалить свободно, но появились сообщения об ошибках, которые подразумевали (для меня), что это было необходимо. Мне действительно нужно было уничтожить базу данных, чтобы она работала. – Frazer