Así que tengo un realmente difícil de entender cuando debería estar conectado a un objeto y cuando no debería estar conectado a un objeto. Lo primero es lo primero, aquí hay un pequeño diagrama de mi modelo de objetos (muy simplificado).LINQ to SQL: Adjuntar o no adjuntar
En mi DAL creo un nuevo DataContext cada vez que hago una operación relacionados con los datos. Digamos, por ejemplo, que quiero guardar un nuevo usuario. En mi capa de negocios, creo un nuevo usuario.
var user = new User();
user.FirstName = "Bob";
user.LastName = "Smith";
user.Username = "bob.smith";
user.Password = StringUtilities.EncodePassword("MyPassword123");
user.Organization = someOrganization; // Assume that someOrganization was loaded and it's data context has been garbage collected.
Ahora quiero ir Guardar este usuario.
var userRepository = new RepositoryFactory.GetRepository<UserRepository>();
userRepository.Save(user);
Neato! Aquí está mi lógica de guardado:
public void Save(User user)
{
if (!DataContext.Users.Contains(user))
{
user.Id = Guid.NewGuid();
user.CreatedDate = DateTime.Now;
user.Disabled = false;
//DataContext.Organizations.Attach(user.Organization);
DataContext.Users.InsertOnSubmit(user);
}
else
{
DataContext.Users.Attach(user);
}
DataContext.SubmitChanges();
// Finished here as well.
user.Detach();
}
Así que, aquí estamos. Notarás que comento el bit donde el DataContext se adjunta a la organización. Si hay que adjuntar a la organización consigo la siguiente excepción:
NotSupportedException:Se ha hecho un intento de Adjuntar o Agregar una entidad que no es nuevo, tal vez con hayan cargado desde otro DataContext. Esto no es compatible.
Hmm, eso no funciona. Déjame probarlo sin adjuntar (es decir, comentar esa línea sobre cómo adjuntar a la organización).
DuplicateKeyException:No se puede agregar una entidad con una clave que ya está en uso .
WHAAAAT? Solo puedo asumir que esto está tratando de insertar una nueva organización que obviamente es falsa.
Entonces, ¿cuál es el problema chicos? ¿Que debería hacer? ¿Cuál es el enfoque adecuado? Parece que L2S hace que este un poco más difícil de lo que debería ser ...
EDIT: simplemente me di cuenta de que si trato de mirar el conjunto de cambios pendientes (dataContext.GetChangeSet()) me sale el mismo ¡NotSupportedException que describí antes! ¡¿Qué demonios, L2S ?!
Simplemente curioso, ¿por qué no utiliza claves externas en la base de datos para indicar la relación en su modelo de objeto? –
Hmm, estoy, estoy en la base de datos ... no estoy seguro de por qué no aparecieron en el diagrama (es decir, esperaría una clave gris) pero tenía la impresión de que la pequeña flecha que iba de una caja a el otro indicó que había una clave foránea en su lugar. –
Usted está usando L2S, no como se supone que debe usarse. Normalmente, casi nunca se llama Attach. ¿Por qué estás usando un repositorio en primer lugar? Solo parece restringir lo que puede hacer y no ofrecerle nada a cambio. Con L2S, DataContext * es * el repositorio. – usr