0

私は以下の2つのモデルを持っています。

地理位置情報モデル:

public class GeoLocation {
        public GeoLocation() { }
        public int Id { get; set; }
        public double Latitude { get; set; }
        public double Longitude { get; set; }
    }

プロバイダーモデル:

public class Provider
    {
        public Provider()
        {
            Id = Guid.NewGuid();
            Created = DateTime.Now;
        }

        public Guid Id { get; set; }
        [Required]
        public string Name { get; set; }

        public virtual GeoLocation Location { get; set; }

    }

リポジトリ方式:

public void SetLocation(string providerKey, GeoLocation location)
        {
            var provider = (from p in Catalog.Providers
                            where p.Key == providerKey
                            select p).Single();

            provider.Location = location;

            Catalog.SaveChanges();
}

上記のように、Provider Table の Location オブジェクトを更新する必要があります。しかし、上記のコードでは奇妙な結果が得られます。つまり、Id を持つ受信ロケーションオブジェクトが 15 としましょう。次に、その ID をプロバイダー テーブルの location Idに更新する必要があります。しかし、上記のコードの後15 ではなく 16 として更新されます。理由を教えてください。ここでの根本的な問題は何ですか?

注:デフォルトの EF 規則マッピングを使用しています。

更新:ここで問題が見つかりました。それは、GeoLocationprovider.Location = location; テーブル自動インクリメント Id の増加を 1に設定したときです。それが原因です。どうすればそれを回避できますか?

4

1 に答える 1

1

どうやって場所を取得しましたか?問題は、EF コンテキスト ( Catalog) が、場所が永続化される新しいオブジェクトであると認識していることです (= ロケーション テーブルへの挿入が生成されます)。すでに存在するオブジェクトであることをカタログに通知する必要があります。

これはトリックになる可能性があります:

if (location.Id > 0) {
    Catalog.GeoLocations.Attach(location);
} 

provider.Location = location;
于 2013-05-08T20:11:46.150 に答える