verwendetes Datenbanksystem: MS SQL 208 Express
Hallo, ich versuche mich gerade zum ersten mal am Entity Framework (Code First). Die Datenbank wurde auch schon erstellt und das hinzufügen eines Eintrags klappt auch.
Probleme bereiten mir noch das Updaten eines Eintrags. Hier mal mein Programm in Kurzfassung:
public class Post
{
public int postId { get; set; }
public virtual ICollection<Comment> comments { get; set; }
}
public class Comment
{
public int commentId { get; set; }
public string text { get; set; }
}
Im DataLayer habe ich dann zwei Funktionen:
public Post GetPost(int _id)
{
Post post;
using (var context = new Context())
{
post = (from p in context.Posts.Include("commentList")
where p.postId == _id
select p).FirstOrDefault();
}
return post;
}
public void UpdatePost(Post _post)
{
using (var context = new Context())
{
context.Entry(_post).State = System.Data.Entity.EntityState.Modified;
context.SaveChanges();
}
}
So und in meiner Main möchte ich dann mal ein einfaches Update durchführen:
static void Main(string[] args)
{
PostLogic postlogic = new PostLogic();
Post post = postlogic.GetPost(1);
post.text = "Hello World";
post.commentList.First<Comment>().text = "ich bin aktualisiert";
postlogic.UpdatePost(post);
}
Läuft soweit Fehlerfrei durch, wenn ich mir dann aber die Datenbanktabelle anschaue, ist "post.text" aktualisiert, bei "comment.text" hat sich jedoch nichts getan.
Klar, ich aktualisiere nur das Post Objekt, aber das verknüpfte Comment müsste ebenfalls mit aktualisiert werden oder verstehe ich das falsch? 🤔
Hi maltek,
ich gehe mal davon aus dass du dich beim Einfügen der Source-Schnippsel vertippt hast. Das würde nämlich nicht funktionieren bzw. nicht mal kompilieren. Die ICollection nennst du "comments", aber beim Include bzw. dem Zugriff darauf verwendest du "commentList".
Und dann gibst du bei
context.Entry(_post).State = System.Data.Entity.EntityState.Modified
lediglich dem _post-Objekt einen modified-Status.
Dass auch der Comment "modified" ist kriegt das EF nicht mit...
Ich würde hier generell eher mit "UnitOfWork" arbeiten.
static void Main(string[] args)
{
using (var context = new Context())
{
PostLogic postlogic = new PostLogic(context);
Post post = postlogic.GetPost(1);
post.text = "Hello World";
post.commentList.First<Comment>().text = "ich bin aktualisiert";
postlogic.UpdatePost(post);
}
}
Dann sparst du dir
context.Entry(_post).State = System.Data.Entity.EntityState.Modified;
weil der Context hier sowieso alle Änderungen tracked.
lg
Edit: was M@tuk mit UoW meint ist im Prinzip der Repository Pattern.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
deswegen hab ich geschrieben "im Prinzip", da RP _immer _ (zu 99,99%) UoW anwendet.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
... und in der Klasse Comment fehlt die Rücknavigation zu Post.