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
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
¿La mejor manera de inicializar un contexto de marco de entidad?
Entity Framework 4.1: cómo trabajar con el contexto de datos de por vida de por vida?
Adjuntar y separar entidades del contexto correctamente en EF4.1
Gestión del tiempo de vida del contexto en el patrón de repositorio y unidad de trabajo
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:
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();
}
}