Frage

Ich bin die Umsetzung Repository-Muster mit ADO.NET Entity Framework. Ich sehe, dass Aufzeichnungen relativ komplizierter als nur das Hinzufügen oder Entfernen aus der Datenbank zu aktualisieren. Im folgenden sehen Sie die Update-Anweisung und fügen Erklärung für Ihr Urteil.

Ich frage mich, ob es eine Möglichkeit ist, dass ich den Rekord aktualisieren kann, ohne die ursprüngliche Datensatz zu retreive zu haben.

 public void Update(User user)
    {
        var userToUpdate = (from u in db.UserSet
                            where u.UserID == user.UserID
                            select u).FirstOrDefault(); //original record
        db.ApplyPropertyChanges(userToUpdate.EntityKey.EntitySetName,
            user); 
        db.SaveChanges();
    }

In Erklärung für den gleichen Repo:

    public void Add(User user)
    {
        user.MemberFrom = DateTime.Now;
        _repository.AddToUserSet(user);
        _repository.SaveChanges();
    }
War es hilfreich?

Lösung

Nein, können Sie nicht tun, mit EF (es sei denn, Sie ADO.NET verwenden, um direkt natürlich). Das heißt, können Sie den Abrufcode vereinfachen, indem sie einige Methoden zur Teil Klasse Ihres Unternehmens Kontext hinzufügen. Dies ist, wie ich es tun:

public partial class MyEntities
{
    public T GetById<T>(object id) where T : class
    {
        EntityKey key = CreateKey<T>(id);
        // see http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.getobjectbykey.aspx
        return (T)GetObjectByKey(key); 
    }

    public static EntityKey CreateKey<T>(object id)
    {
        var type = typeof(T);
        return new EntityKey("MyEntities." + type.Name, "Id", id);
    }
}

Nun sollte Ihr oben Code sein

public void Update(User user)
{
    var userToUpdate = db.GetById<UserSet>(user.UserID); 
    db.ApplyPropertyChanges(userToUpdate.EntityKey.EntitySetName, user); 
    db.SaveChanges();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top