0

テストベースにこのテストがあります:

public void WorksWithAreaUsers()
        {
            using (new TransactionScope())
            {
                //arrange
                var userBusiness = new UserBusiness();
                var user = new User
                {
                    Name = "TestUser###",
                    Login = "domain\test-user###"
                };
                userBusiness.Add(user);

                var areaBusiness = new AreaBusiness();
                var area = new Area
                {
                    Name = "TestArea###",
                    Description = "Test Area Description",
                    Users = new List<User> { user }
                };

                //act
                areaBusiness.Add(area);

                //assert
                var areaFromDb = areaBusiness.FindById(area.AreaID);
                Assert.IsNotNull(areaFromDb.Users);
                Assert.IsTrue(areaFromDb.Users.Count > 0);
                Assert.IsTrue(areaFromDb.Users.Any(c => c.UserID == user.UserID));
            }
        }

それが何をしているのか:

  • 新しいユーザーをベースに挿入します。
  • ユーザー関係を使用して、新しい領域をベースに挿入します。

実際に何が起こるか:

  • 新しいユーザーが挿入されます。
  • 新しい領域が挿入されます。
  • 新しいユーザーがエリア関係で再度挿入されます。

何が起こっている可能性がありますか?

詳しくは:

  • Area と User は実際には EntityObject ではありません。AutoMapper を使用して DTO/Entity をマッピングしていますが、問題はこのロジックにあると思います。ある時点で、List と EntityCollection の間でマッピングを行う必要があります。新しい EntityCollection を作成し、EntityCollection.Add メソッドを使用して、このコレクションに UserEntity に変換された User を配置します。新しいエンティティを作成しないためには Attach を使用する必要があると思いますが、適切なバインドなしで EntityCollection から呼び出された場合、このメソッドは機能しません。

それより賢い何か、またはこの問題を解決するための回避策を提案しますか? プロジェクト レイヤー (Web -> ビジネス -> データ -> EF) が本当に必要です。モジュール性の理由から、EF と直接連携する asp.net はここでは実行できません。

編集

AutoMapper を使用してこの仕事を行うという考えをあきらめています =/ 私は多くのエンティティを持っておらず、機能させるためにこのライブラリで行う必要がある変更にはいくらかの努力が必要です。それは些細なことではありませんする。自分でマッピングを行う方が良いです。

4

2 に答える 2

1

Userオブジェクトには、エンティティ間の関係を確立するためにも使用できるAreaプロパティがあると思います。Area.Usersを新しいリストに等しく設定する代わりに、areaオブジェクトを作成した後、User.Areaを新しいareaに等しく設定するだけです。これは私が新しいエンティティの関連付けを処理する方法であり、確実に機能します。

編集

私があなたのしていることを理解しているなら、あなたは後でエンティティオブジェクト(EO)を作成し、それらのEOをコンテキストにアタッチして保存するビジネスオブジェクト(BO)を作成しています。

基本が正しいと仮定すると、問題の正確な原因を特定するには、それぞれのBOがEOを作成し、コンテキストにアタッチする方法のコードを確認する必要があります。

于 2009-08-12T14:30:56.160 に答える
0

私の推測 (これは推測にすぎません) は、AutoMapper が ID 解決を行っていないことです。

そのため、グラフ内の異なる場所に同じオブジェクト (ユーザー) が表示されると、以前に作成したオブジェクトを再利用するのではなく、新しいオブジェクトを作成します。

これはおそらくあなたが見ているものを説明するでしょう。

アレックス

于 2009-08-12T16:00:05.760 に答える