Entity framework 4 实体框架4.1代码优先,组合主键作为外键

Entity framework 4 实体框架4.1代码优先,组合主键作为外键,entity-framework-4,entity-framework-4.1,ef-code-first,composite-primary-key,Entity Framework 4,Entity Framework 4.1,Ef Code First,Composite Primary Key,我在实体框架中遇到了一个问题,我有一些类似于以下模型的东西: public class ClassA { public int ClassAID { get; set; } } public class ClassB { public int ClassBID { get; set; } } public class ClassC { public int ClassAID { get; set; } //Foreign Keys combined as Primary Key

我在实体框架中遇到了一个问题,我有一些类似于以下模型的东西:

public class ClassA
{
  public int ClassAID { get; set; }
}

public class ClassB
{
  public int ClassBID { get; set; }
}

public class ClassC
{
  public int ClassAID { get; set; } //Foreign Keys combined as Primary Key
  public int ClassBID { get; set; }

  public virtual ClassA SomeA { get; set; }
  public virtual ClassB SomeB { get; set; }
  public virtual ClassD SomeD { get; set; }
}

public class ClassD
{
  public int ClassAID { get; set; } //Primary Key and also references Class C Primary Key
  public int ClassBID { get; set; }

  public virtual ClassC SomeC { get; set; }
}
ClassD是我遇到问题的地方,我希望表示ClassC上主键的属性是ClassD上的主键,但也是外键引用。假设上述属性名称与表列名相同

在底层数据库中,ClassC和ClassD的对应表具有一对一的关系,其中ClassA到ClassC和ClassB到ClassC是一对多的关系

然而,当谈到实体框架时,它似乎不能同时处理作为主键和外键的多个同名属性,在它生成的底层SQL中,我可以看到它在寻找列ClassD_ClassAID,ClassD_ClassBID-有没有一种方法可以使用模型配置来指定正确的映射

我试过:

this.HasKey(c => new { c.ClassAID, c.ClassBID });
this.HasRequired(c => c.ClassC)
.WithRequiredDependent();
我也试过:

this.HasKey(c => new { c.ClassAID, c.ClassBID });
this.HasRequired(c => c.ClassC)
.WithRequiredDependent()
.Map(m => m.MapKey("ClassAID", "ClassBID"));
到目前为止,任何引入映射的尝试都会遇到错误

“元数据中已存在属性名xxx”


我不确定以下是否解决了您的问题,因为我不明白您提到的异常可能来自何处:

modelBuilder.Entity .HasKeyc=>new{c.ClassAId,c.ClassBId}; modelBuilder.Entity .HasKeyd=>new{d.ClassAId,d.ClassBId} .HasRequiredd=>d.SomeC .WithRequiredDependentc=>c.SomeD; 这里的重要部分是在WithRequiredDependent中的关系的另一端指定导航属性。如果使用无参数重载,EF将在ClassC和ClassD之间创建第二个关系,并且SomeD将属于此关系,而不是您正在配置的关系

I如果您没有为ClassA和ClassB指定任何进一步的映射,则EF将基于上述映射和约定创建以下三种关系:

ClassA->ClassC FK=ClassC中的ClassAId ClassB->ClassC FK=ClassC中的ClassBId ClassC->ClassD FK=ClassAId,ClassD中的ClassBId
因此,ClassD有一个复合主键,它同时也是ClassC的复合外键。

我不确定以下是否解决了您的问题,因为我不明白您提到的异常可能来自何处:

modelBuilder.Entity .HasKeyc=>new{c.ClassAId,c.ClassBId}; modelBuilder.Entity .HasKeyd=>new{d.ClassAId,d.ClassBId} .HasRequiredd=>d.SomeC .WithRequiredDependentc=>c.SomeD; 这里的重要部分是在WithRequiredDependent中的关系的另一端指定导航属性。如果使用无参数重载,EF将在ClassC和ClassD之间创建第二个关系,并且SomeD将属于此关系,而不是您正在配置的关系

I如果您没有为ClassA和ClassB指定任何进一步的映射,则EF将基于上述映射和约定创建以下三种关系:

ClassA->ClassC FK=ClassC中的ClassAId ClassB->ClassC FK=ClassC中的ClassBId ClassC->ClassD FK=ClassAId,ClassD中的ClassBId
因此,ClassD有一个复合主键,它同时也是ClassC的复合外键。

看来我所缺少的只是明确地指定这个映射:使用'.WithRequiredDependentc=>c.SomeD;'谢谢似乎我所缺少的就是明确地指定这个映射:使用'.WithRequiredDependentc=>c.SomeD;'谢谢