Primero, el código de Entity Framework-Definición de relaciones/claves
entity-framework entity-framework-4.1 (2)
Estoy diseñando mi base de datos usando código primero y necesito un poco de ayuda, creo.
Estoy recibiendo este error:
La introducción de la restricción FOREIGN KEY ''SalesOrder_Invoices'' en la tabla ''Facturas'' puede causar ciclos o múltiples rutas en cascada. Especifique ON DELETE NO ACTION o ON UPDATE NO ACTION, o modifique otras restricciones FOREIGN KEY.
No se pudo crear una restricción. Ver errores previos.
Estoy tratando de tener las siguientes relaciones / claves:
--> = 1 to Many Relationship
- Cliente -> CustomerLocation
- CustomerLocation -> SalesOrder
- SalesOrder -> Factura
- SalesRep -> SalesOrder
- PaymentTerm -> Cliente
- PaymentTerm -> SalesOrder
- PaymentTerm -> Factura
Estoy tratando de definirlos por el estándar de:
<ClassName><PrimaryKeyID>
Ejemplo: El Customer
tiene una propiedad ID
, por lo que en CustomerLocation
defino la clave foránea de esta manera:
Public Property CustomerID AS Integer
Todo lo que tengo que hacer es definir la clave externa correcta? ¿También tengo que tener propiedades de navegación para cada tecla que defina?
Y, ¿no puedo tener varias claves foráneas en la misma clave principal de un objeto?
Actualizado
Entonces, para definir una relación, ¿usas ClassName.PrimaryKeyProperty
? o usas propiedades de navegación? ¿O ambos? ¡¡Confuso!!
Actualización 2
Entonces para hacer que una relación funcione tienes que definir ambos lados ... creo.
Public Class Customer
Public Property ID AS Integer
Public Overrideable Property Locations AS ICollection(OF CustomerLocation)
End Class
Public Class CustomerLocation
Public Property ID AS Integer
Public Property CustomerID AS Integer
End Class
Esta es una excepción causada por el servidor SQL cuando tiene múltiples rutas de eliminaciones en cascada. Si elimina su PaymentTerm, activará la eliminación en cascada en las tres relaciones. Esto explotará al crear SalesOrder
o Invoice
. EF crea por defecto todas las relaciones de uno a muchos con ON DELETE CASCADE
. Puede reasignar su relación específica para no usarla de la siguiente manera:
modelBuilder.Entity<...>()
.HasRequired(...)
.WithMany(...)
.HasForeignKey(...)
.WillCascadeOnDelete(false);
O puede desactivarlo globalmente eliminando la convención:
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
Puede evitar este error en una migración en particular editando el método Up()
generado con una línea como esta:
AddForeignKey("dbo.Payments", "EventID", "dbo.Events", "EventID", cascadeDelete: true)
y cambie esa cascadeDelete:
value a false en la (s) relación (es) ofensiva (s).
Lea this , estoy seguro de que esto lo ayudará a encontrar la respuesta.
Además, de acuerdo con la publicación de blog de ScottGu, creo que, en general, debería ser que creara las clases de la siguiente manera (no lo leí con cuidado, por lo que debería consultarlo para obtener más detalles):
public class Customer
{
public int CustomerID { get; set; }
public int CustomerLocationID { get; set; }
public virtual CustomerLocation Location { get; set; }
}
public class CustomerLocation
{
public int CustomerLocationID { get; set; }
public virtual ICollection<Customer> Customers { get; set; }
}