我正在尝试将 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 的任何解决方法?