10

He configurado una relación de 1-a-1 utilizando el código EF primera siguiendo el método prescrito aquí:Excepción causante de la relación 1 a 1: AssociationSet está en estado 'Eliminado'. Teniendo en cuenta las restricciones de multiplicidad

Unidirectional One-To-One relationship in Entity Framework

Mi mapeo se parece a esto ...

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Asset>() 
     .HasRequired(i => i.NewsItem) 
     .WithOptional(e => e.Asset) 
     .Map(m => m.MapKey("NewsItemId")); 
} 

Pero cuando obtengo esta excepción ...

Una relación del conjunto de asociaciones 'Asset_NewsItem' está en estado 'Eliminado'. Dadas las restricciones de multiplicidad, un 'Asset_NewsItem_Source' correspondiente también debe estar en el estado 'Eliminado'.

Cada vez que se ejecuta este código:

var entry = _db.NewsItems.Find(id); 

entry.Asset = new Asset(); 

_db.DbContext.SaveChanges(); 

puedo conseguir que las cosas funcionen si puedo marcar explícitamente al Activo anterior asociado al elemento Novedades para su eliminación, pero parece un poco torcidas. Parece que, basado en el mapeo, el código anterior simplemente debería funcionar ... reemplazando el antiguo activo por el nuevo.

¿Estoy haciendo algo mal? ¿Hay algo que deba especificar en el mapeo que hará que las cosas funcionen bien? O, ¿es simplemente la manera EF de tener que eliminar y luego agregar objetos asociados como este?

Respuesta

7

Así es como funciona EF. Ha cargado una entrada con un activo relacionado y sabe que desea asignar un nuevo activo. Esta operación hará que su antiguo activo no esté relacionado con ninguna entrada, pero su mapeo no lo permite (usted especificó que Asset debe tener relacionado Entry). Por lo tanto, debe eliminar el activo anterior o asignarlo a otra entrada antes de asignar el nuevo activo para satisfacer sus limitaciones de asignación.

+3

No parece muy ORM'ish, pero entiendo lo que dices. ¿Hay una mejor manera de mapear la relación que permitiría simplemente establecer el nuevo activo? O, por desgracia, el mapeo es correcto y solo tengo que lidiar con él: :) Gracias. – wgpubs

+1

Me encontré con lo mismo. Muy frustrante. Creo que NHibernate maneja esto como debería ser manejado. –

+0

@MikeCole: ¿y cómo se debe manejar? –

Cuestiones relacionadas