pattern net framework example driven domain ddd business c# .net entity-framework design-patterns domain-driven-design

c# - net - Contexto por solicitud: cómo actualizar la entidad



domain driven design c# example (1)

Tengo una clase de repositorio como se muestra a continuación. Hay un método para obtener el objeto de entidad: GetPaymentByID. Estoy recuperando un objeto de pago y realizando un cambio en su propiedad PaymentType. Pero esto no se refleja en databse. Sé el motivo: el método SaveContextChanges usa un nuevo contexto.

Necesito usar el enfoque de Contexto por solicitud . Por lo tanto, estoy creando un nuevo contexto en cada método.

En este escenario, ¿cómo puedo modificar el código para actualizar correctamente la base de datos?

Nota: El programa cliente no debe usar ObjectContext porque el repositorio se puede cambiar con otro repositorio que no use Entity Framework .

Nota : " Un DataContext es liviano y no es caro de crear "

namespace MyRepository { public class MyPaymentRepository { private string connectionStringVal; public MyPaymentRepository() { SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder(); sqlBuilder.DataSource = "."; sqlBuilder.InitialCatalog = "LibraryReservationSystem"; sqlBuilder.IntegratedSecurity = true; // Initialize the EntityConnectionStringBuilder. EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(); entityBuilder.Provider = "System.Data.SqlClient"; entityBuilder.ProviderConnectionString = sqlBuilder.ToString(); entityBuilder.Metadata = @"res://*/MyEDMtest.csdl|res://*/MyEDMtest.ssdl|res://*/MyEDMtest.msl"; connectionStringVal = entityBuilder.ToString(); } public MyEntityDataModelEDM.Payment GetPaymentByID(int paymentID) { MyEntityDataModelEDM.Payment payment; using (var myObjectContext2 = new MyEntityDataModelEDM.LibraryReservationSystemEntities(connectionStringVal)) { Func<MyEntityDataModelEDM.Payment, bool> predicate = (p => p.PaymentID == paymentID); payment = myObjectContext2.Payments.SingleOrDefault(predicate); } return payment; } public void SaveContextChanges(MyEntityDataModelEDM.Payment paymentEntity) { using (var myObjectContext = new MyEntityDataModelEDM.LibraryReservationSystemEntities(connectionStringVal)) { myObjectContext.SaveChanges(); } } } }

Cliente

MyRepository.MyPaymentRepository rep = new MyRepository.MyPaymentRepository(); MyEntityDataModelEDM.Payment p2= rep.GetPaymentByID(1); p2.PaymentType = "TeSSS"; rep.SaveContextChanges(p2);

LEYENDO

  1. Agregar / Adjuntar y Estados de Entidad: http://blogs.msdn.com/b/adonet/archive/2011/01/29/using-dbcontext-in-ef-feature-ctp5-part-4-add-attach-and -entity-states.aspx

  2. ¿La mejor manera de inicializar un contexto de marco de entidad?

  3. Entity Framework 4.1: cómo trabajar con el contexto de datos de por vida de por vida?

  4. Adjuntar y separar entidades del contexto correctamente en EF4.1

  5. Gestión del tiempo de vida del contexto en el patrón de repositorio y unidad de trabajo

  6. Entity Framework Contextos de objetos múltiples

  7. EF4 - Context.Entry no está disponible para cambiar un estado de entidad


Debe agregar (si los datos son nuevos) o adjuntar (si los datos se editan) el objeto al contexto:

http://blogs.msdn.com/b/adonet/archive/2011/01/29/using-dbcontext-in-ef-feature-ctp5-part-4-add-attach-and-entity-states.aspx

Algo en esta línea:

public void SaveContextChanges(MyEntityDataModelEDM.Payment paymentEntity) { using (var myObjectContext = new MyEntityDataModelEDM.LibraryReservationSystemEntities(connectionStringVal)) { // use your own logic for determining a "new" entity myObjectContext.Entry(paymentEntity).State = (paymentEntity.PaymentID == default(int)) ? EntityState.Added : EntityState.Modified; myObjectContext.SaveChanges(); } }