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 スクリプト フラグメントが生成されます。
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に適合させるための回避策を知っている人はいますか?