Se ha intentado adjuntar o agregar una entidad que no es nueva, quizás cargada desde otro DataContext. Esto no es compatible

Mi proyecto se divide en PresentationLayer, BusinesLogicLayer y DataAccessLayer. Cada objeto creado pasa por estas capas. Simplificando:

SetFilter.xaml.cs

FilterFactory fFactory = new FilterFactory();
Filter myFilter = fFactory.Create(someClient, time, message);
FilterBLO filterBLO = new FilterBLO();
filterBLO.Save(myFilter);

FilterBLO.cs

FilterDAO filterDAO = new FilterDAO();
using (TransactionScope transcope = new TransactionScope())
{
    filterDAO.Save(myFilter);
    transcope.Complete()
}

FilterDAO.cs

using(DBDataContext dbdc = new DBDataContext)
{
    dbdc.Filter.InsertOnSubmit(myFilter);
    changeSet = dbdc.GetChangeSet();
    dbdc.SubmitChanges()
}

El filtro está conectado con la mesa Client usar ClientFilter tabla que contiene FilterID y ClientID. (relación de muchos a muchos)

Si creo nuevos 3 objetos, todo está bien, pero si estoy actualizando Client en la base de datos (también usando ClientBLO y ClientDAO así que por separado TransactionScope y separar DBDataContext) Recibo un error:

Se ha intentado adjuntar o agregar una entidad que no es nueva, quizás cargada desde otro DataContext. Esto no es compatible.

(Busqué otros hilos similares pero no encontré una solución a mi problema).

Y finalmente mi pregunta

¿Cómo debo ahorrar? myFilter if Client existe en la base de datos. Lo intenté Attach() al contexto de datos en FilterDAO.cs pero obtengo el mismo error.

preguntado el 08 de noviembre de 11 a las 13:11

Donde / como myFilter ser creado? -

@ChrisF Agregué esta sección. En xaml.cs (presentationLayer) usando FilterFactory () -

¿Qué FilterFactory ¿hacer? -

@ChrisF Solo devuelve un nuevo filtro (algún cliente, hora, mensaje); -

1 Respuestas

Debe obtener Client de la base de datos con el mismo DataContext que usa para InsertOnSubmit the Filter; luego debe establecer el valor del Cliente en el objeto Filtro con ese objeto antes de InsertOnSubmit.

respondido 08 nov., 11:18

Sé que se debe a otro DataContext, pero no tengo una buena idea de cómo hacerlo en mi estructura. Y tal vez haya alguna otra solución que no sea el DataContext global (porque creo que esa división es una mejor solución, ¿no es así?) - San

Debería hacerlo en un escenario no transaccional. ¿Qué tal pasar el DataContext al DAL y crear uno nuevo si el que se pasó es nulo? - Andrea Colleoni

¿Qué quieres decir? ¿Propone, devolver DataContext de ClientDAL a PresentationLayer y pasarlo de nuevo a FilterDAL? Es un tipo de solución, pero no estoy seguro de cómo corregir tal acción desde la perspectiva de sql y linq: San

Creo que es mejor que confíe en obtener el DataContext de una fábrica; Consígalo en PresentationLayer (donde comienza y termina la lógica transaccional) y páselo a todas tus clases xxDAO. Todas las clases xxxDAO deberían aceptar un argumento DataContext y, si es nulo, llamar a la misma fábrica que usa en la capa de presentación. - Andrea Colleoni

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.