Laden...

Verständnisfrage zum Entity Framework

Erstellt von maltek vor 10 Jahren Letzter Beitrag vor 10 Jahren 904 Views
M
maltek Themenstarter:in
40 Beiträge seit 2010
vor 10 Jahren
Verständnisfrage zum Entity Framework

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? 🤔

M
402 Beiträge seit 2005
vor 10 Jahren

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

16.834 Beiträge seit 2008
vor 10 Jahren
  1. Klassennamen sind im singular und werden groß geschrieben; Properties ebenfalls.
  2. Ständig in jeder Methode einen Context erstellen ist ganz schlecht => Repository Pattern anschauen und anwenden, dann brauchst Du so ein schmutziges Modified auch nicht.

Edit: was M@tuk mit UoW meint ist im Prinzip der Repository Pattern.

F
10.010 Beiträge seit 2004
vor 10 Jahren

UnitOfWork != Repository Pattern

16.834 Beiträge seit 2008
vor 10 Jahren

deswegen hab ich geschrieben "im Prinzip", da RP _immer _ (zu 99,99%) UoW anwendet.

W
955 Beiträge seit 2010
vor 10 Jahren

... und in der Klasse Comment fehlt die Rücknavigation zu Post.