5

私は数週間前に新しいプロジェクトを開始したばかりで、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 プロパティ) を含むすべての情報を含む新しい住所を作成します。

これにより、古い都市への参照を使用する代わりに、新しい都市が作成されます。

4

1 に答える 1