2

私は最初にコードを実行し、タイプごとのテーブルデザインを使用しています。2番目のオブジェクトを複数のテーブルに拡張すると、次のエラーが発生します。

エンティティまたはアソシエーション間で共有される値は、複数の場所で生成されます。マッピングによって、EntityKeyが複数のストアで生成された列に分割されないことを確認してください。

私のデータベースは次のようになります。

賛成票を投じて、私の写真を追加するために編集していただきありがとうございます。 ここに画像の説明を入力してください

プロジェクトのPOCOは次のようになります。

public abstract class Project {
    public int ProjectID { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public virtual ICollection<Tag> Tags { get; set; }
    public virtual ICollection<LocationElement> LocationElements { get; set; }


    public abstract string getProjectIdentifier();

}

そして、ロケーション要素の場合:

public enum HowObtainedCodes {
    Provided = 1,
    Estimated = 2,
    Summarized = 3
}
public abstract class LocationElement {
    public int LocationElementID { get; set; }
    public int ProjectID { get; set; }
    public HowObtainedCodes HowObtainedCodeID { get; set; }
}

そしてポイントのために:

[Table("ProvidedPoints")]
public class ProvidedPoint : LocationElement {
    public double Lat { get; set; }
    public double Long { get; set; }
    public string Description { get; set; }
}

プロジェクト(抽象)から科学ライセンスへのリンクは正常に機能し、私のオブジェクトは期待どおりにロード/持続します。さらに、抽象化しない場合は、LocationElementsオブジェクトを追加できます。LocationElementsを拡張し、ProvidedPointオブジェクトを保存しようとすると、上記のメッセージが表示されます。私が最初に考えたのは、ProvidedPointsのLocationElementIDがIdentity列として設定されていることでしたが、そうではありませんでした。

私の質問は、2つのTPTオブジェクトをこのようにリンクしようとして、予期しないことをしているのでしょうか。私は何か他のものが欠けていますか?

4

1 に答える 1

0

上記の @leppie が指摘したように、LocationElement クラスを注釈 [Table("LocationElements")] で装飾する必要がありました。これにより、問題はすぐに修正されました。EF に関する私の理解では、これは TPT 設計のベース テーブルでは不要であり、さらに Project / ScientificLicence のペアでは実行していません (つまり、ScientificLicence オブジェクトを装飾しただけです)。

これは、新しい Project オブジェクトを保存するときに LocationElements が追加/永続化される方法と関係があると思います。誰かが追加の洞察を持っているなら、もっと知りたいです。

これが他の誰かに役立つことを願っています.leppieに感謝します!

于 2012-12-07T17:00:17.100 に答える