实体框架 - 可以在外键中使用复合主键的一部分

时间:2013-09-18 21:58:09

标签: c# entity-framework entity-framework-5

我正在尝试将Entity Framework 5与旧数据库相匹配,其中2个表都定义了复合主键。

Product(ProductId, VersionId, Name, StrengthId) <- ProductId and VersionId form the PK
Strength(StrengthId, VersionId, Description) <- StrengthId and VersionId form the PK

在定义为Product.StrengthId和Product.VersionID的2个表之间有一个外键,它与Strength.StrengthId和Strength.VersionId有关,这意味着外键使用了两个表的复合主键的一部分。

我按如下方式设置了映射:

    public ProductConfiguraton()
    {
        ToTable("t_Product");
        HasKey(p => new { p.Id, p.VersionId });

        HasRequired(p => p.Strength)
            .WithMany(b => b.Products)
            .Map(m => m.MapKey("iStrengthID", "iVersionID"));

        Property(p => p.Id).HasColumnName("iProductId");
        Property(p => p.Name).HasColumnName("sName");
        //Property(p => p.VersionId).HasColumnName("iVersionID");

    }

    public StrengthConfiguration()
    {
        ToTable("t_Strength");
        HasKey(p =>  new { p.Id, p.VersionId });

        Property(p => p.Id).HasColumnName("iStrengthID");
        Property(p => p.VersionId).HasColumnName("iVersionID");
        Property(p => p.Description).HasColumnName("sStrengthText");
    }

生成以下创建表脚本片段:

CREATE TABLE IF NOT EXISTS t_LIVE_Product (
  iD INTEGER NOT NULL,
  VersionId INTEGER NOT NULL,
  sName text NULL,
  iStrengthID INTEGER NOT NULL,
  iVersionID INTEGER NOT NULL,
  PRIMARY KEY (iD, VersionId),
  FOREIGN KEY (iStrengthID, iVersionID) REFERENCES t_LIVE_Strength (iStrengthID, iVersionID) ON DELETE CASCADE
);

-- Index for foreign key FK_Product_Strength
CREATE INDEX IX_FK_Product_Strength ON t_LIVE_Product (iStrengthID, iVersionID);

CREATE TABLE IF NOT EXISTS t_LIVE_Strength ( 
  iStrengthID INTEGER NOT NULL,
  iVersionID INTEGER NOT NULL,
  sStrengthText text NULL,
  PRIMARY KEY (iStrengthID, iVersionID)
);

Product表为VersionId(VersionId和iVersionID)创建了2列,这不是我想要的。如果我取消注释我的ProductConfiguration中的最后一行,我收到以下错误:

  

错误0019:类型中的每个属性名称必须是唯一的。已定义属性名称“iVersionID”。

这是有道理的,但让我无法解决我的问题。

我正在尝试做什么或者是否有人知道尝试将此架构融入EF的任何变通办法?

1 个答案:

答案 0 :(得分:1)

我不确定,但你可以尝试一下。

public ProductConfiguraton()
{
    ToTable("t_Product");
    HasKey(p => new { p.Id, p.VersionId });

    HasRequired(p => new {p.VersionId, p.StrengthId})
        .WithMany(b => new {b.VersionId, b.Id})
        .HasForeignKey(p => p.VersionIdStrengthId);

    Property(p => p.Id).HasColumnName("iProductId");
    Property(p => p.VersionId).HasColumnName("iVersionID");
    Property(p => p.Name).HasColumnName("sName");
    Property(p => p.StrengthId).HasColumnName("iStrengthId");

}

<强>更新

或试试这个:

    HasRequired(p => new {p.VersionId, p.StrengthId})
        .WithMany()
        .HasForeignKey(b => new {b.VersionId, b.Id});