SQL Server 2008に次のテーブル定義があるとします。
_CREATE TABLE Person
(PersonId INT IDENTITY NOT NULL PRIMARY KEY,
Name VARCHAR(50) NOT NULL,
ManyMoreIrrelevantColumns VARCHAR(MAX) NOT NULL)
CREATE TABLE Model
(ModelId INT IDENTITY NOT NULL PRIMARY KEY,
ModelName VARCHAR(50) NOT NULL,
Description VARCHAR(200) NULL)
CREATE TABLE ModelScore
(ModelId INT NOT NULL REFERENCES Model (ModelId),
Score INT NOT NULL,
Definition VARCHAR(100) NULL,
PRIMARY KEY (ModelId, Score))
CREATE TABLE PersonModelScore
(PersonId INT NOT NULL REFERENCES Person (PersonId),
ModelId INT NOT NULL,
Score INT NOT NULL,
PRIMARY KEY (PersonId, ModelId),
FOREIGN KEY (ModelId, Score) REFERENCES ModelScore (ModelId, Score))
_
ここでの考え方は、各PersonはモデルごとにModelScoreを1つだけ持つことができますが、各Personは定義されたモデルの任意の数のスコアを持つことができるということです。私の知る限り、このSQLはこれらの制約を自然に強制するはずです。 ModelScoreには、定義に含まれる特定の「意味」があります。そこに地球を揺るがすものは何もありません。
次に、デザイナーを使用して、これをEntity Frameworkに変換してみます。データベースからモデルを更新して編集した後、Personオブジェクト、Modelオブジェクト、ModelScoreオブジェクトができました。結合テーブルであるPersonModelScoreはオブジェクトではなく、他の名前(ModelScorePersonAssociationなど)との関連付けとして含まれています。関連付けのマッピングの詳細は次のとおりです。
- 協会 -PersonModelScore -ModelScore にマップします。ModelId:Int32 <=> ModelId:int スコア:Int32 <=>スコア:int - Person PersonId:Int32 <=> PersonId:int
右側のModelIdとPersonIdの値には主キーシンボルがありますが、Score値にはありません。
コンパイルすると、次のようになります。
Error 3002: Problem in Mapping Fragment starting at line 5190: Potential runtime violation of table PersonModelScore's keys (PersonModelScore.ModelId, PersonModelScore.PersonId): Columns (PersonModelScore.PersonId, PersonModelScore.ModelId) are mapped to EntitySet ModelScorePersonAssociation's properties (ModelScorePersonAssociation.Person.PersonId, ModelScorePersonAssociation.ModelScore.ModelId) on the conceptual side but they do not form the EntitySet's key properties (ModelScorePersonAssociation.ModelScore.ModelId, ModelScorePersonAssociation.ModelScore.Score, ModelScorePersonAssociation.Person.PersonId).
デザイナーやその他で何が悪いのですか、そしてどのようにしてエラーを修正できますか?
どうもありがとう!
非常に遅くあなたの質問に私は同じ問題を抱えていて、エンティティフレームワークのデザイナーが "ScoreId"列(PersonModelScoreテーブルに対して)を主キー列として識別していることを発見しました。私は、ScoreIdの設定をfalseに変更しましたが、その後はすべてうまくいきました。
このエラーを回避するために、エンティティに単一の主キーを設定できます。主キーが多数ある場合は、エンティティのフィールドのスカラープロパティを右クリックし、エンティティキーを無効にします。
テーブルごとに1つのIDキーを作成する必要があります。
ModelScoreにはModelScoreId、PersonModelScoreにはPersonModelScoreIdが必要です。
テーブル間の参照は単一のフィールドでなければなりません。
PersonModelScoreテーブルは、IDと主キーであるId列を定義する必要があります。次に、PersonId、ModelIdに一意のキーを作成する必要があります
エラー3002の場合と同じ問題が発生しました[〜#〜] all [〜#〜]私のフィールドはEFによってエンティティキーとしてマークされていました
「.edmxファイルに移動し、背景を右クリックして[マッピングの詳細]を選択します。edmxウィンドウでマッピングを編集する必要のあるテーブルをクリックすると、新しい[マッピングの詳細]ウィンドウに詳細が表示されます。 [プロパティ]タブを開きます(開いていない場合はF4を押して[プロパティ]を表示します)[マッピングの詳細]の[値/プロパティ]をクリックして表示されるプロパティを変更します。プロパティウィンドウから[エンティティキー]を設定できます'value to' False '。– Chris Paton Oct 4 '14 at 18:54 "
これでうまくいきました-ありがとうEF Database Firstを使用する場合、これは私のワークフローの一部になりました。そして、データモデルを更新するタスクがあります。