2009-05-29 3 views
0

私は、私が理由を理解していると思うにもかかわらず、これは面白いです。私はUnitTestを作成して、私の継承の問題についてアレックスの提案をしようとするブログエントリを追加しました。今私は別のものに出くわす。EF4 - ブログエントリを追加すると、プロフィールに不満がありますか?

[TestMethod] 
public void UserCanAddBlogEntry() 
{ 
    var context = new EntityContext(Options.LazyLoading); 

    var user = (from u in context.Users 
        .Include("Blog.BlogEntries") 
       where u.Id == 1 
       select u).FirstOrDefault(); 

    BlogEntry entry = new BlogEntry(); 
    entry.Header = "Test Entry"; 
    entry.Text = "Test Text blah blah blah"; 
    entry.CreatedAt = DateTime.Now; 
    entry.Blog = user.Blog; 

    user.Blog.BlogEntries.Add(entry); 
    context.SaveChanges(); 

    Assert.IsTrue(user.Blog.BlogEntries.Count > 0); 
} 

は、例外が発生:

失敗UserCanAddBlogEntry Zirzle.UnitTests
試験方法UserCanAddBlogEntryは 例外をスロー: のSystem.InvalidOperationException:の ナビゲーションプロパティ 'ユーザ' で検出 無効関係フィックスアップをタイプ 'Profile'の エンティティ。

この画像に間違いがありますか。私が.Include( "Profile")をgetクエリに追加した場合、変更を保存してもそれ以上不満はありません。私はプロファイルのための0.1の関係の終わりを追加しようとしたが、どちらもうまくいかなかった。助言がありますか?私はスタックのオーバーフロー個人EFの専門家が説明を持っているかもしれないと思う:)

答えて

1

まあこれは興味深いです。

私はBlog.BlogEntriesBlogEntry.Blog

私はまた、すべてのクラスのすべてのプロパティが仮想であることを仮定しているの逆数であることを仮定しているので、EFは、プロキシクラスをすることができます。

ObjectContextがそれらを構築し、あなたがそれらを自分で作成したので、いくつかは、(entry)プロキシされませんので、いくつかのオブジェクトは、(useruser.Blog)にプロキシされますこれらの仮定を考えます。

プロキシ・クラスを自動的すなわちだから、プロキシuser.Blogにこれをやって

同期に関係の両端を保持し、アップを修正すればよい:

user.Blog.BlogEntries.Add(entry) 

は自動的にuser.Blogentry.Blogを設定します同じ時間にあなたのために両方の関係を同期させてください。一方

entryがプロキシされていないため、この:

entry.Blog = user.Blog 

はフィックスアップしないだろう。

このコードでは、本質的にフィックスアップの半分を2回実行しています。おそらくこの状況をうまく処理する必要がありますが、明らかにそうではありません。私はチームと話をします。これは動作するはず

BlogEntry entry = new BlogEntry(); 
entry.Header = "Test Entry"; 
entry.Text = "Test Text blah blah blah"; 
entry.CreatedAt = DateTime.Now; 
entry.Blog = blog; 
//because BlogEntry inherits from Post if I remember your model 
context.Posts.Add(entry); 
context.SaveChanges(); 

// notice there is no need to get the User just the users blog 
var blog = (from u in context.Users 
      where u.Id == 1 
      select u.Blog).Single(); 

だけがこれを行う:

は、私はあなたが何か少しsimplierを行うことを示唆しているすべてを語りました。

アレックス

+0

あなたの前提はすべて正しいものでした。私はまだあなたの提案を使用してフィックスアップで問題を抱えています: テストメソッドUserCanAddBlogEntryが例外をスローしました:System.InvalidOperationException:無効なリレーションシップフィックスが、タイプ 'Blog'のエンティティのナビゲーションプロパティ 'BlogEntries'で検出されました。 – mhenrixon

+0

ええと...私は今、ちょっと困っています。 代わりに、 blog.BlogEntries.Add(エントリー)を試してみるとどうなるのか、私に知らせてください。 –

+0

私はあなたが1つのことを除いて示唆したようにしました。私はメソッドのAddEntry(Entryエントリ)を作成しました。これは、DOM.net にエントリを追加するだけで、poco投稿ads.netのブログには推奨されています。将来はUserクラスに入るはずです。私にフィックスアップの問題を与えていることを示唆していることを2つの問題があります。あなたがコメントで示唆したことをすることは、私にnull参照例外を与えます。私は何らかの問題を作り出すのはプロキシだと思うが、真剣にそれがバグかどうかわからない。私はそれが私に教えてくれる自分自身を世話することができると言いました。とにかくこのように文脈を公開するつもりはありません。 – mhenrixon

関連する問題