Entity framework EF 4.1 Fluent API。如何在使用具有三个id列的现有联接表时映射两个实体?

Entity framework EF 4.1 Fluent API。如何在使用具有三个id列的现有联接表时映射两个实体?,entity-framework,entity-framework-4.1,mapping,fluent-interface,Entity Framework,Entity Framework 4.1,Mapping,Fluent Interface,代码中有三个实体(EntityA、EntityB、EntityC),数据库中有它们各自的表(TableA、TableB、TableC)。我还有一个现有的联接表,它有三个ID列(TableA_ID、TableB_ID、TableC_ID) 在代码中,实体的关联如下: MODELS: public class EntityA { public Guid EntityA_ID { get; set } ..... // Each EntityA can be associated w

代码中有三个实体(EntityA、EntityB、EntityC),数据库中有它们各自的表(TableA、TableB、TableC)。我还有一个现有的联接表,它有三个ID列(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"});

                });
关于如何在数据上下文中重新配置映射,使其不会产生错误,并且还将包括在ThreeIDColumnJoinTable中指定的EntityA关系,有什么想法吗

//每个EntityB可以与0或多个EntityC关联,但当EntityB与EntityA关联时,它将变为0或1

在这种情况下,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; }
}
公共类实体b
{
公共Guid EntityB_ID{get;set;}
.....
//每个EntityB可以与0或多个EntityA关联
公共虚拟ICollection EntityACollection{get;set;}
公共虚拟ICollection EntityCollection{get;set;}
}
您需要EntityC集合来支持“多”部分。数据库/模型无法强制执行规则的第二部分。它必须由应用程序逻辑强制执行

模型的其余部分可以按原样使用。去掉流畅的映射,你应该得到A和B之间的多对多关系以及B和C之间的一对多关系。这正是你的规则所规定的


没有什么比三张桌子的自动多对多更好的了。如果需要(而不是当前情况),则必须将连接表映射为第四个实体,并将其他三个实体的点导航属性映射到这个提供关系桥的新实体。

难道没有连接表条目的实体吗?另外,我认为您在最后一行中误用了
Map
方法。此版本仅用于映射外键列名(请查看Intellisense中的描述)。Slauma没有为联接表创建实体,因为我以前从未创建过实体(用于两列的直接多对多关系)。此外,“映射”代码是我最后一次尝试我能想到的所有不同的前置运算。我将尝试创建联接表实体,看看还会出现什么。是的,对于多对多联接表,您不需要实体。但是这个表必须正好有两列,这两列构成一个复合键,并且是相关表的FK。不允许使用其他类型的联接表。如果我将EntityD称为复合键实体,这是否意味着我还必须将EntityD的导航属性添加到EntityA、EntityB和EntityC中,以及将EntityA、B、C的导航属性添加到D中?对不起,如果这听起来不清楚,但EF不是我的强项。Thxy您通常只需要一个关联的导航属性。第二个始终是可选的。顺便说一句:为什么你不简单地在A和B之间映射一个正常的多对多关系,在B和C之间映射一个正常的一对一关系呢?我不理解在这个连接表中需要第三个键列。因此,根据您和Slauma迄今为止提供的信息,似乎如果我为我的表(包括连接/连接表)创建一个模型,然后在我的上下文类中为这些表中的每一个添加一个DbSet项,然后我将相应的相关导航属性添加到它们各自的模型中,那么我就不必使用ModelBuilder.Entity()的fluent API.Map(…)方法了?这是一个正确的断言吗?我相信你们不需要实体来表示连接表,而只需要表示a、B和C。否则你们的理解是正确的。感谢这两个增加了我的理解。我一直致力于尝试使用.Map(…),因为这是我在大多数示例中看到的。为联接表创建模型并在其他模型中添加正确的导航属性解决了我的问题。
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; }
}