2011-12-04 24 views
7
public class Client 
{ 
    public Int32 ClientID { get; set; } 

    public virtual ICollection<Inquiry> InquiryManufacturers { get; set; } 
    public virtual ICollection<Product> Products { get; set; } 
    public virtual ICollection<Inquiry> InquiryRetailers { get; set; } 
} 

public class Product 
{ 
    public Int32 ProductID { get; set; } 

    public Int32 ClientID { get; set; } 
    public virtual Client Client { get; set; } 

    public virtual ICollection<Inquiry> Inquiries { get; set; } 
} 

public class Inquiry 
{ 
    public Int32 InquiryID { get; set; } 

    public Int32 ProductID { get; set; } 
    public Int32 ManufacturerID { get; set; } 
    public Int32 RetailerID { get; set; } 
    public virtual Product Product { get; set; } 
    public virtual Client Manufacturer { get; set; } 
    public virtual Client Retailer { get; set; } 
} 

La API fluida es tan¿Primer código que causa que la relación requerida sea opcional?

HasRequired(i => i.Product) 
    .WithMany(p => p.Inquiries); 
HasRequired(i => i.Manufacturer) 
    .WithMany(p => p.InquiryManufacturers) 
    .HasForeignKey(p => p.ManufacturerID); 
HasRequired(i => i.Retailer) 
    .WithMany(p => p.InquiryRetailers) 
    .HasForeignKey(p => p.RetailerID); 

Así que aquí hay algunas clases que he definido. Tienen relaciones de la siguiente manera: Cliente & El producto tiene uno para muchos, Cliente & Consulta tiene uno para muchos y el Producto & Consulta tiene uno para muchos. Estoy usando Code First aquí. Ahora, usando una API fluida, he definido las relaciones, se supone que estas relaciones son obligatorias, lo que significa que el Cliente & La relación del producto no puede ser nula, así como el Cliente y la Consulta tampoco puede ser nula.

Sin embargo, la relación entre la consulta del cliente & está siendo forzada a ser una opción con el código primero. Cuando intento hacerlos necesarios, EF no genera la base de datos.

¿Puede alguien decirme qué problema hay en mi modelo que está causando que EF no cree una relación requerida entre el cliente & Inruiry? ¿Esto se debe a la eliminación de cascada? A medida que leo algunos, mssql solo puede tener una ruta de eliminación en cascada entre Cliente, Producto e Indagación. Cualquier explicación de ayuda sería agradable.

+0

¿Estás recibiendo algún error? ¿A qué te refieres con "se lo está forzando a ser opcional"? – CDeutsch

+0

no hay errores solo que la base de datos no se genera, pero si hago que el RetailerID y el ManufacturerID nulos y el Fluent Api como HasOptional se genera la base de datos. – user781310

+0

Por favor, publique la configuración de mapeo completa: todo lo que está relacionado con las 3 entidades que se discuten. Proporcione suficiente información para reproducir su situación. Además, ¿a qué motor de db te diriges? –

Respuesta

2

Código EF Primero establece la eliminación en cascada verdadera de la restricción de claves foráneas generadas de manera predeterminada. Y porque sólo se puede tener uno rutas en cascada se obtiene una excepción algo como esto:.

"Presentación de restricción FOREIGN KEY 'Inquiry_Retailer' de la tabla 'consultas' pueden causar ciclos o múltiples rutas en cascada especifique en BORRAR NO acción o ON UPDATE ninguna acción, o modificar otras restricciones de clave externa

En el modelo que tiene 3 rutas en cascada del cliente al mensaje:.

cliente --InquiryRetailers ->Consulta
cliente --InquiryManufacturers ->mensaje
cliente --Productos ->Producto --Inquiries ->mensaje

Así que debe establecer WillCascadeOnDelete(false) al menos para dos relaciones (según sus requisitos):

modelBuilder.Entity<Inquiry>().HasRequired(i => i.Product) 
    .WithMany(p => p.Inquiries); 
modelBuilder.Entity<Inquiry>().HasRequired(i => i.Manufacturer) 
    .WithMany(p => p.InquiryManufacturers) 
    .HasForeignKey(p => p.ManufacturerID).WillCascadeOnDelete(false); 
modelBuilder.Entity<Inquiry>().HasRequired(i => i.Retailer) 
    .WithMany(p => p.InquiryRetailers) 
    .HasForeignKey(p => p.RetailerID).WillCascadeOnDelete(false); 
+0

Gracias, perdón por la respuesta tardía, pero estaba ocupado, después de leer algunos otros blogs y reservar, me di cuenta de que la eliminación predeterminada de la cascada era el problema. – user781310

Cuestiones relacionadas