Erstellen eines neuen MVC -Projekts und der Idee von Repositorys in der Datenschicht, also habe ich sie implementiert. Ich habe auch eine Serviceschicht erstellt, um die gesamte Geschäftslogik und -validierung zu verarbeiten. Diese Ebene verwendet wiederum das entsprechende Repository. So etwas (ich verwende einen einfachen Injektor, um zu injizieren) < /p>
Dal -Schicht < /p>
public class MyRepository {
private DbContext _context;
public MyRepository(DbContext context) {
_context = context;
}
public MyEntity Get(int id)
{
return _context.Set().Find(id);
}
public TEntity Add(MyEntity t)
{
_context.Set().Add(t);
_context.SaveChanges();
return t;
}
public TEntity Update(MyEntity updated, int key)
{
if (updated == null)
return null;
MyEntity existing = _context.Set().Find(key);
if (existing != null)
{
_context.Entry(existing).CurrentValues.SetValues(updated);
_context.SaveChanges();
}
return existing;
}
public void Delete(MyEntity t)
{
_context.Set().Remove(t);
_context.SaveChanges();
}
}
< /code>
Serviceschicht < /p>
public class MyService {
private MyRepository _repository;
public MyService(MyRepository repository) {
_repository = repository;
}
public MyEntity Get(int id)
{
return _repository.Get(id);
}
public MyEntity Add(MyEntity t)
{
_repository.Add(t);
return t;
}
public MyEntity Update(MyEntity updated)
{
return _repository.Update(updated, updated.Id);
}
public void Delete(MyEntity t)
{
_repository.Delete(t);
}
}
< /code>
Nun ist dies sehr einfach, daher kann ich den folgenden Code verwenden, um ein Objekt zu aktualisieren. < /p>
MyEntity entity = MyService.Get(123);
MyEntity.Name = "HELLO WORLD";
entity = MyService.Update(entity);
< /code>
Oder dies, um ein Objekt zu erstellen < /p>
MyEntity entity = new MyEntity();
MyEntity.Name = "HELLO WORLD";
entity = MyService.Add(entity);
// entity.Id is now populated
< /code>
Sagen Sie jetzt, ich musste ein Element basierend auf der Erstellungs -ID eines anderen aktualisieren. Ich könnte den Code vor allem gut verwenden. Aber was passiert, wenn ein Fehler auftritt? Ich brauche eine Art Transaktion/Rollback. Ist dies das, was die Einheit des Arbeitsmusters löst?public class UnitOfWork : IDisposable {
private DbContext _context;
public UnitOfWork(DbContext context) {
_context = context;
}
public Commit() {
_context.SaveChanges();
}
public Dispose() {
_context.Dispose();
}
}
< /code>
Ok, das ist noch einmal, das ist ganz einfach. UnitOfwork hält auch den Kontext (ich verwende sowieso denselben Kontext für alle Repositorys) und ruft die Savechanges () -Methode auf. Ich würde dann den Savechanges () -Methodenaufruf von meinem Repository entfernen. Zum Hinzufügen würde ich Folgendes machen: < /p>
UnitOfWork uow = new UnitOfWork(new DbContext()); // i would inject this somehow
MyEntity entity = new MyEntity();
MyEntity.Name = "HELLO WORLD";
entity = MyService.Add(entity);
uow.Commit();
< /code>
, aber was ist, wenn ich ein Objekt erstellen und dann andere Objekte basierend auf dieser ID aktualisieren muss, funktioniert dies jetzt nicht, da die ID nicht erstellt wird, wenn ich mich auf die UOW bezeichne. Beispiel < /p>
UnitOfWork uow = new UnitOfWork(new DbContext()); // i would inject this somehow
MyEntity entity = new MyEntity();
MyEntity.Name = "HELLO WORLD";
entity = MyService.Add(entity);
// entity.Id is NOT populated
MyEntity otherEntity = MyService.Get(123);
otherEntity.OtherProperty = entity.Id;
MyService.Update(otherEntity);
uow.Commit(); // otherEntity.OtherProperty is not linked.....?
< /code>
Ich habe also das Gefühl, dass diese UnitOfwork -Klasse nicht richtig ist ... Vielleicht vermisse ich etwas zu verstehen. Möglicherweise mit Entity Framework und Repositories?
Entity Framework 6 und Arbeitseinheit ... wo, wann? Ist es wie Transaktionen in ado.net? ⇐ C#
-
- Similar Topics
- Replies
- Views
- Last post