1

私はここで簡単な何かが欠けていると思います。エラーが発生しました:

"PRIMARYKEY制約'PK_FeatureTypes'の違反。オブジェクト'dbo.FeatureTypeCodes'に重複キーを挿入できません。重複キー値は(28)です。\ r\nステートメントは終了しました。"

FeatureType-(Mountain、Lake、Riverなど)のルックアップ/リンクテーブルがあります。これにはすでにデータが入力されており、次のように定義されています。

[Table("FeatureTypeCodes")]
public class FeatureTypeCode {
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int FeatureTypeCodeID { get; set; }
    public string Name { get; set; }
}

これは私の場所のテーブル/オブジェクトに次のようにリンクされています:

[Table("Places")]
public class Place {
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int PlaceID { get; set; }
    public string Name { get; set; }
    public FeatureTypeCode FeatureTypeCode { get; set; }
    public ICollection<PlaceCoordinate> PlaceCoordinates { get; set; }
}

次に、次のように古いデータベースからそれらをロードしています(これは私の変換コードの一部です):

foreach (DataRow r in table.Rows) {
        int ftID = Convert.ToInt32(r["FeatureTypeId"]);
        Place temp = new Place {
                PlaceID = Convert.ToInt32(r["PlaceID"]),
                Name = r["PlaceName"].ToString(),
                FeatureTypeCode = featureTypeCodeRepository.FeatureTypeCodes.FirstOrDefault(o=>o.FeatureTypeCodeID == ftID)
            };
            places.Add(temp);
        }

Placeの保存中に、既存のオブジェクトと同じIDを持つ新しいFeatureTypeオブジェクトを挿入しようとすると、エラーが生成されます。私の考えでは、コンテキストからFeatureTypeをロードしても、Placeオブジェクトの保存時に新しいFeatureTypeを挿入しようとはしませんでした。私は明らかにそれについて間違っていますが、それは私が見逃している単純なものですか?

4

2 に答える 2

2

featureTypeCodeRepositoryとで同じDBContextオブジェクトを使用しているとは思いませんplaces.Add(temp);。したがって、基本的にEFは、あるコンテキストによってロードされ、別のコンテキストによって保存されるため、FeatureTypeCodesを追跡しないと思います。

于 2012-12-11T22:09:36.703 に答える
0

SimonEdströmは正しい(+1)と思いますが、クラスでプリミティブ外部キーフィールド( FeatureTypeId?など)を公開することも検討してください。Place次に、簡単に設定できます

FeatureTypeId = ftID;

FeatureTypeCodesFKフィールド値が実際にテーブルに存在するかどうかわからない場合featureTypeCodeRepositoryは、コンテキストが異なる場合でも、FKフィールド値を使用してその存在を照会できます。使用Any()するのが最も安価な方法です。

var exists = featureTypeCodeRepository.FeatureTypeCodes
                 .Any(o => o.FeatureTypeCodeID == ftID)

エンティティフレームワークでこれを行うことは珍しいことではありません。Place.FeatureTypeCode参照(のような)のみで構成される関係は、独立した関連付けと呼ばれ、参照とプリミティブFKプロパティの外部キーの関連付けを持つ関係です。彼女の本DbContextのジュリアラーマンは言います

外部キーのプロパティを公開しない非常に正当な理由がない限り、それらを含めることで多くの苦痛を軽減できます。

于 2012-12-12T00:12:22.260 に答える