EF 4.1 Свободный API. Как отобразить две сущности при использовании существующей таблицы соединений, которая имеет три столбца идентификаторов? - PullRequest
0 голосов
/ 16 января 2012

У меня есть три объекта (EntityA, EntityB, EntityC) в коде и их соответствующие таблицы (TableA, TableB, TableC) в базе данных. У меня также есть существующая таблица соединений с тремя столбцами идентификаторов (TableA_ID, TableB_ID, TableC_ID).

В коде сущности связаны следующим образом:

MODELS:
public class EntityA
{
   public Guid EntityA_ID { get; set }
   .....
   // Each EntityA can be associated with 0 or Many EntityB
   public virtual ICollection<EntityB> EntityBCollection { get; set; }
}

public class EntityB
{
   public Guid EntityB_ID { get; set; }
   .....
   // Each EntityB can be associated with 0 or Many EntityA
   public virtual ICollection<EntityA> EntityACollection { get; set; }

   // Each EntityB can be assocated with 0 or Many EntityC,
   // but it becomes 0 or 1 when EntityB is associated with an EntityA
   public virtual EntityC EntityC { get; set; }
}

public class EntityC
{
   public Guid EntityC_ID { get; set; }
   ......
   // Each EntityC an only be associated with a EntityB
   // an EntityC does not exist on its own
   public virtual EntityB EntityB { get; set; }
}

DATA CONTEXT:
modelBuilder.Entity<EntityB>()
                .HasOptional(entityb => entityb.EntityC)
                .WithRequired(entityc => entityc.EntityB)
                .Map(map =>
                {
                    map.ToTable("ThreeIDColumnJoinTable").MapKey(new string[]{"EntityA_ID", "EntityB_ID", "EntityC_ID"});

                });

Я продолжаю получать следующую ошибку:

Unable to determine the principal end of an association between the types 'EntityC' and 'EntityB'. The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations. 

Любые идеи о том, как я могу перенастроить отображение в КОНТЕКСТЕ ДАННЫХ, чтобы оно не вызывало ошибки, а также включало в себя отношение EntityA, указанное в ThreeIDColumnJoinTable?

1 Ответ

0 голосов
/ 17 января 2012

// Каждый EntityB может быть связан с 0 или Many EntityC, но становится 0 или 1, когда EntityB связан с EntityA

. В этом случае ваш EntityB имеет неправильное свойство навигации,Это должно быть:

public class EntityB
{
   public Guid EntityB_ID { get; set; }
   .....
   // Each EntityB can be associated with 0 or Many EntityA
   public virtual ICollection<EntityA> EntityACollection { get; set; }

   public virtual ICollection<EntityC> EntityCCollection { get; set; }
}

Вам необходим набор EntityC для поддержки части "Многие".Вторая часть правила не может быть применена базой данных / моделью.Это должно выполняться вашей логикой приложения.

Остальная часть вашей модели может быть использована как есть.Удалите это беглое отображение, и вы должны получить отношение «многие ко многим» между A и B и отношение «один ко многим» между B и C. Это именно то, что говорится в ваших правилах.

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

...