【问题标题】:Entity Framework - Possible to have part of compound primary key used in foreign key实体框架 - 可能在外键中使用部分复合主键
【发布时间】:2013-09-19 14:41:12
【问题描述】:

我正在尝试将 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 创建了 2 列(VersionId 和 iVersionID),这不是我想要的。如果我取消注释 ProductConfiguration 中的最后一行,则会收到以下错误:

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

这是有道理的,但让我离解决问题更近了一步。

我正在尝试做的事情是否可行,或者是否有人知道尝试将此架构适合 EF 的任何变通方法?

【问题讨论】:

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


    【解决方案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});
    

    【讨论】:

    • 你在外键中创建的 VersionIdStrengthId 是什么?这不会尝试为该键创建一个新列吗?
    • 我不确定。你可以试试我建议的。
    • 太好了,第二个成功了,谢谢!当你知道怎么做的时候就简单了。
    猜你喜欢
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 2012-03-26
    相关资源
    最近更新 更多