私は数週間前に新しいプロジェクトを開始したばかりで、EF Code First を試してみることにしました。以前は NHIbernate を使用していましたが、MS のすぐれた ORM を持つというアイデアが気に入りました。複雑なオブジェクトを作り始めるまで。
私のプロジェクトの階層は次のとおりです。 Azure WCF ロール - EF Code First で DAL を処理します。Knockout を使用した MVC 4 を使用した Azure WebSite ロール - クライアントに対処します。(私は、さまざまなプラットフォームからサービスにアクセスする必要がある将来のために WCFRole を作成しました)
これは私が問題を抱えている非常に基本的な EF Code First 設計です: - サービスとサイト間で DTO のみを転送し、内部 DTO が存在する場合はそれをマップする汎用マッパーを作成しました。- City テーブルと、City プロパティを持つ Address オブジェクトがあります (名前だけでなく、特別な機能のプロパティとして City が必要です)。
クライアントは都市のリストを知っており、既存の都市で新しい住所を返しています。新しい住所を追加しようとすると、古い既存の都市のデータを使用して新しい都市が作成されます。切断されたオブジェクトをマージする方法がわからず、私が読んだことから、マージ機能はサポートされていません。単純ではないあまり快適ではない解決策は、オブジェクトの状態を管理することです-Cityオブジェクトの状態をUnchangedに変更します。
しかし、これを大きく複雑なデータベース設計で処理するのは恐ろしいことです
私の質問 - これを処理するベストプラクティス/簡単な方法は何ですか? 私は次のような解決策について考えました-すべてのオブジェクトを通過するSaveChangesメソッドをオーバーライドし、IDがnull/0でない場合/追加から未変更に変更するその他の規則-この解決策を実行できますか?
私の2番目の質問-私はNHibernate(接続されたオブジェクトを使用)で多くの経験を持っているため、NHibernateがこれをどのように受け止めているのか疑問に思っていましたか?NHibernate には、切断された複雑なオブジェクトを再接続する AutoMagic Merge 機能があるとどこかで読みましたが、これは本当ですか? 私の基本的な切断された Address->City デザインは、その AutoMagic Merge ですぐに使用できますか? そして、それを使用することの影響は何ですか?
どうもありがとう :)
更新: 問題の簡略化されたコード。
public class Address
{
public int ID { get; set; }
public virtual City City { get; set; }
}
public class City
{
public int ID { get; set; }
public string Name { get; set; }
public virtual Zone Zone { get; set; }
}
public class MyContext : DbContext
{
public MyContext() : base("TransportService") { }
public virtual DbSet<City> Cities { get; set; }
public virtual DbSet<Address> Addresses { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Address>()
.HasRequired(x => x.City)
.WithMany().WillCascadeOnDelete(true);
}
}
新しい住所の追加:
public void Add(AddressDto address)
{
using (var context = new MyContext())
{
context.Addresses.Add(address.FromDto<Address>());
context.SaveChanges();
}
}
"FromDto" は一般的な Mapper 拡張機能で、City (および City.ID プロパティ) を含むすべての情報を含む新しい住所を作成します。
これにより、古い都市への参照を使用する代わりに、新しい都市が作成されます。