2010-05-28 11 views
6

Estoy usando EF 4, mapeando todas las operaciones CUD para mis entidades usando sprocs.Entidad Marco 4 Entity con EntityState of Ungedged disparando actualización

Tengo dos tablas, DIRECCIÓN y PERSONA. Una PERSONA puede tener múltiples DIRECCIONES asociadas a ellos.

Aquí está el código que estoy corriendo:

Person person = (from p in context.People 
          where p.PersonUID == 1 
          select p).FirstOrDefault(); 

Address address = (from a in context.Addresses 
           where a.AddressUID == 51 
           select a).FirstOrDefault(); 

address.AddressLn2 = "Test"; 

context.SaveChanges(); 

La Dirección está actualizando está asociado con la persona que soy retrieveing ​​- aunque no están explícitamente ligados de alguna manera en el código. Cuando el contexto.GuardarCambios() se ejecuta no solo se inicia el proceso de Actualización para mi entidad de Dirección (como era de esperar), sino que también lo hace el proceso de Actualización para la entidad Persona - aunque puede ver que no se realizó ningún cambio en el Entidad de la persona

Cuando compruebo el EntityState de ambos objetos antes de la llamada context.SaveChanges() veo que mi entidad Address tiene un EntityState de "Modified" y mi Personity tiene un EntityState de "Unchanged".

¿Por qué se llama a Update sproc para la entidad Person? ¿Existe alguna configuración que pueda establecer para evitar que esto suceda?


Creé un segundo proyecto para asegurarme de que el problema no ocurría debido a algo en mi entorno de proyecto actual.

En primer lugar, creé una nueva base de datos que contiene una tabla de Order y OrderDetail. Tienen una clave foránea entre ellos para que Order pueda tener más de un OrderDetail asociado. También creé desencadenantes DB "después de la actualización" en las tablas Order y OrderDetail que actualizan un campo DateTime cuando se actualiza un registro.

En segundo lugar, creé una aplicación WPF simple y creé un modelo de entidad ADO.NET que se generó a partir de mi base de datos.

En tercer lugar, he añadido a mi código de constructor de la clase de la siguiente manera:

public partial class MainWindow : Window 
    { 
    public MainWindow() 
    { 
     InitializeComponent(); 

     MyEntities context = new MyEntities(); 

     Order order = (from o in context.Orders 
       select o).FirstOrDefault(); 

     OrderDetail orderDetail = (from d in order.OrderDetails 
        select d).FirstOrDefault(); 

     orderDetail.Qty = 7; 

     context.SaveChanges(); 
    } 
    } 

Me corrió el programa sin hacer ninguna correlación de funciones para mi Orden y objetos OrderDetail. El resultado fue exactamente lo que esperaría ver, el registro OrderDetail se actualiza para tener una cantidad de 7 y el campo UpdateDateTime se llena con la fecha y hora en que se produjo la actualización. No hay cambios en mi registro de la Orden, lo que significa que no se produjo ninguna actualización.

Luego creo procedimientos almacenados para manejar la actualización de las tablas Order y OrderDetail en la base de datos. No hacen nada especial, solo aceptan parámetros para cada columna en la tabla y luego configuran cada campo igual al parámetro asociado. Luego correlacioné esos procedimientos almacenados con mis objetos de Modelo usando la ventana Detalles de Mapeo (Entidad de Mapa a Funciones).

Después de hacer la asignación, ejecuté el programa. Como resultado, observé el comportamiento esperado de ver actualizaciones en la tabla OrderDetail, pero además el activador de la tabla de pedidos "después de la actualización" se había disparado y el campo UdateDateTime se había establecido en la fecha y hora en que se produjo la actualización, lo cual no era de esperar.

¿Alguien sabe de una manera de utilizar los procedimientos almacenados para todas las operaciones Insertar, Actualizar y Eliminar y no tener las actualizaciones conectadas en cascada a las entidades relacionadas?

+0

Solo para asegurarse, no hay otro código asociado con su error? – Nix

+0

No aparece un error. Simplemente no veo el comportamiento que espero y me pregunto por qué y qué debo hacer para ver el comportamiento esperado, que sería que solo la entidad de Dirección se actualiza en el DB. El único otro código sería la creación de instancias de mi objeto de contexto que solo crea una nueva instancia del contexto de entidad generado por EF. – Filosopher

+0

ACTUALIZACIÓN: Como dije en mi publicación original, estoy usando procedimientos almacenados para manejar Crear, Actualizar y Eliminar en todas mis tablas. Acabo de eliminar esas asignaciones de mi Modelo y ejecuté el código nuevamente con un desencadenador DB en la tabla Person y NO HUBO ACTUALIZACIÓN. Parece que son las asignaciones de sproc para Crear, Actualizar y Eliminar lo que está causando que la Actualización ocurra en este caso. Desafortunadamente, tenemos que usar sprocs para esas operaciones, por lo que aún se requiere una resolución. Solo pensé en actualizar la publicación con más información. – Filosopher

Respuesta

4

Tuve este mismo problema, y ​​ha sido resuelto por la revisión mencionada en that MS KBD page.

La corrección solo se publicó ampliamente en .NET 4.5. Sin embargo, espero que EF 6 (que funciona tanto en .NET 4/.NET 4.5) también envíe esa corrección, ya que sustituye a la versión de System.Data.Entity.dll que se entrega con .NET 4 con la suya propia.

Cuestiones relacionadas