2009-05-29 7 views
0

Ich muss Admin das ist irgendwie lustig, obwohl ich denke, ich verstehe, warum :) Ich habe eine UnitTest erstellt, um einen Blog-Eintrag zu versuchen, Alex Vorschlag über meine Vererbungsprobleme zu versuchen. Jetzt stoße ich auf einen anderen.EF4 - Hinzufügen eines Blogeintrags beschwert sich über Profil?

[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); 
} 

verursacht die Ausnahme:

fehlgeschlagen UserCanAddBlogEntry Zirzle.UnitTests
Prüfnorm UserCanAddBlogEntry warf Ausnahme: System.InvalidOperationException: Ungültige Fixup Beziehung in die Navigationseigenschaft 'User' erfasst von die Entität des Typs 'Profil'.

Nicht sicher, was mit diesem Bild nicht stimmt. Wenn ich .Include ("Profile") in die Get-Abfrage einfüge, dann speichere Änderungen nicht mehr. Ich habe versucht, ein 0.1 Verhältnis Ende für Profil hinzuzufügen, aber das hat auch nicht geklappt. Irgendwelche Vorschläge? Ich nehme an Stack-Überläufe persönliche EF-Experte könnte eine Erklärung haben :)

Antwort

1

Nun, dieser ist interessant.

Ich gehe davon aus, dass Blog.BlogEntries ist die Umkehrung von BlogEntry.Blog

ich auch gehe davon aus, dass alle Eigenschaften auf allen Klassen virtuell sind, so dass die EF können die Klassen-Proxy.

Unter diesen Voraussetzungen einige Objekte proxied werden (user und user.Blog), weil die ObjectContext sie konstruiert und einige werden nicht proxied werden (entry), weil Sie sie selbst erstellt.

Proxied Klassen automatisch tun fix-up, dh halten beide Enden einer Beziehung synchron

tun dies also auf einem proxied user.Blog:

user.Blog.BlogEntries.Add(entry) 

automatisch entry.Blog zu user.Blog auf die gesetzt werden Gleichzeitig halten Sie beide Beziehungen für Sie synchron.

Auf der anderen Seite, weil entry dies nicht proxied ist:

entry.Blog = user.Blog 

wird Fixup nicht tun.

Also in diesem Code machen Sie im Wesentlichen die eine Hälfte der Korrektur zweimal. Wir sollten diese Situation wahrscheinlich elegant bewältigen, aber offensichtlich sind wir es nicht, ich werde das mit dem Team besprechen.

Nachdem alles gesagt, was ich Ihnen vorschlagen, etwas ein wenig simplier tun:

// 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(); 

und nur dies tun:

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(); 

Diese funktionieren sollte.

Alex

+0

Alle Ihre Annahmen waren richtig. Ich habe jedoch immer noch Probleme mit der Reparatur mit Ihrem Vorschlag: Test Methode UserCanAddBlogEntry warf Ausnahme: System.InvalidOperationException: Ungültige Beziehung Reparatur erkannt in der Navigationseigenschaft 'BlogEntries' der Entität des Typs 'Blog'. – mhenrixon

+0

Hmm ... Ich bin gerade ein wenig verwirrt. Anstelle von entry.Blog = Blog lassen Sie mich wissen, was passiert, wenn Sie versuchen blog.BlogEntries.Add (Eintrag) statt. –

+0

Ich tat, wie Sie vorgeschlagen, außer für eine Sache. Ich habe eine a-Methode AddEntry (Entry-Eintrag) erstellt, die nur einen Eintrag zu der IList wie in den Poco-Posts ado.net Blog empfohlen hinzugefügt hat. Sollte in Zukunft in der Benutzerklasse sein. Es gibt zwei Probleme. Wenn Sie das tun, was Sie vorgeschlagen haben, wird das Problem behoben. Wenn Sie das tun, was Sie in dem Kommentar vorgeschlagen haben, gibt es eine Nullreferenz-Ausnahme. Ich denke, es ist der Proxy, der eine Art Problem verursacht, aber im Ernst, ich weiß nicht einmal, ob es ein Fehler ist. Ich meine, ich sagte, ich kann auf mich selbst aufpassen. Ich werde den Kontext auf diese Weise sowieso nicht aufdecken. – mhenrixon

Verwandte Themen