Configurar el comportamiento de eliminación con 2 relaciones utilizando Fluent API.
Estoy utilizando Fluent API en mi aplicación .NET Core con EF. Tengo un modelo de Chat entre 2 usuarios:
public class Chat
{<br>
//(id, texto...)
public string InitiatorId { get; set; }
public ApplicationUser Initiator { get; set; }
public string InvitedId { get; set; }
public ApplicationUser Invited { get; set; }
}
public class ApplicationUser
{<br>
//(id...)
public List<chat> Chats{ get; set; }
}
El problema es que quiero que el chat se elimine si uno de estos usuarios se elimina y no puedo declararlo de esa manera en mi dbContext:
builder.Entity<chat>()
.HasOne(x => x.Initiator)
.WithMany(x => x.Chats)
.OnDelete(DeleteBehavior.Cascade);
builder.Entity<chat>()
.HasOne(x => x.Invited)
.WithMany(x => x.Chats)
.OnDelete(DeleteBehavior.Cascade);
Obtengo el siguiente error:
No se puede crear una relación entre ‘ApplicationUser.Chats’ y ‘Chat.Invited’ porque ya existe una relación entre ‘ApplicationUser.Chats’ y ‘Chat.Initiator’. Las propiedades de navegación solo pueden participar en una sola relación. Si desea anular una relación existente, llame a ‘Ignore’ en la navegación ‘Chat.Invited’ primero en ‘OnModelCreating’.
¿Existe una manera adecuada de hacer lo que quiero con Fluent API?
davy.ai
Sí, hay una manera adecuada de lograr lo que quieres utilizando Fluent API en tu aplicación .NET Core con EF. El mensaje de error que recibiste significa que ya existe una relación entre la propiedad de navegación
ApplicationUser.Chats
y la propiedadChat.Initiator
, y la propiedadChat.Invited
no puede participar en una segunda relación con ella. Para anular la relación existente y permitir que la propiedadChat.Invited
participe en una relación separada, puedes llamar al métodoIgnore
en primer lugar en la propiedadChat.Initiator
dentro del métodoOnModelCreating
de tudbContext
. Luego, puedes agregar el métodoOnDelete
a ambas relaciones para eliminar el chat cuando uno de los usuarios sea eliminado. Tu código modificado se vería algo como esto:Este código crea dos relaciones separadas entre la propiedad de navegación
ApplicationUser.Chats
y las propiedadesChat.Initiator
yChat.Invited
, respectivamente, y configura ambas relaciones para eliminar el chat cuando uno de los usuarios sea eliminado. El métodoIgnore
en la propiedadChat.Initiator
anula la relación existente y permite que la propiedadChat.Invited
participe en una relación separada.Con estos cambios, tu código debería funcionar como se espera.