2012-07-20 13 views
5

que estoy usando las siguientes clases para una relación de uno a muchos:EF utilizando el código en primer lugar con uno-a-muchos relación creación de claves externas duplicadas

public class Supplier 
{ 
    public Supplier() 
    { 
     SupplierId = Guid.NewGuid(); 
    } 

    public Guid SupplierId { get; set; } 
    [Required] 
    public string Name { get; set; } 

    [Required] 
    public virtual Address Address { get; set; } 

    public virtual ICollection<Contact> Contacts { get; set; } 
} 

public class Contact 
{ 
    public Contact() 
    { 
     ContactId = Guid.NewGuid(); 
    } 

    public Guid ContactId { get; set; } 

    [Required] 
    public string FirstName { get; set; } 
    [Required] 
    public string LastName { get; set; } 

    [Required] 
    public Guid SupplierId { get; set; } 
    [ForeignKey("SupplierId")] 
    public virtual Supplier Supplier { get; set; } 
} 

estoy usando ASP.NET MVC 4 y al crear un nuevo contacto, IdProveedor se pasa en la cadena de consulta y se añade al contacto crear la forma como un campo oculto:

@Html.HiddenFor(model => model.SupplierId) 

Esto crea el contacto con éxito y poblar la materia IdProveedor del contacto con el GUID de la cadena de consulta. Sin embargo, el problema es que la tabla de contactos tiene otro campo para la relación de proveedor virtual llamada Supplier_SupplierId y este campo es NULL. No estoy seguro de entender por qué Supplier_SupplierId se está creando en la tabla de contactos, ya que SupplierId se debería usar como la clave externa y esto sería redundante. Si trato de acceder a la colección Contactos de un Proveedor al que agregué con éxito un Contacto, la colección vuelve vacía porque Contact.Supplier_SupplierId es NULL. Sin embargo, si copio el valor de la columna SupplierId en la columna Supplier_SupplierId del registro de contacto, Supplier.Contacts devolverá el contacto.

Esto es lo que mi tabla Contactos termina pareciéndose a:

CREATE TABLE [dbo].[Contacts] (
    [ContactId]   UNIQUEIDENTIFIER NOT NULL, 
    [FirstName]   NVARCHAR (MAX) NOT NULL, 
    [LastName]   NVARCHAR (MAX) NOT NULL, 
    [Supplier_SupplierId] UNIQUEIDENTIFIER NULL, 
    CONSTRAINT [PK_dbo.Contacts] PRIMARY KEY CLUSTERED ([ContactId] ASC), 
    CONSTRAINT [FK_dbo.Contacts_dbo.Suppliers_SupplierId] FOREIGN KEY ([SupplierId]) REFERENCES [dbo].[Suppliers] ([SupplierId]), 
    CONSTRAINT [FK_dbo.Contacts_dbo.Suppliers_Supplier_SupplierId] FOREIGN KEY ([Supplier_SupplierId]) REFERENCES [dbo].[Suppliers] ([SupplierId]) 
); 

¿Alguien sabe por qué 2 claves externas a proveedores se están creando en los contactos? ¿Cómo puedo cambiarlo para que la única clave extranjera para Proveedores sea SupplierId?

+0

¿Tiene algún mapeo con Fluent API? ¿Has eliminado algunas convenciones? ¿Están completas las clases que muestra o hay más propiedades de navegación entre 'Proveedor' y' Contacto'? – Slauma

+1

Estoy reemplazando la función OnModelCreating con el fin de corregir la caminos de cascada múltiple error: modelBuilder.Entity () .HasRequired (r => r.Supplier) .WithMany() .HasForeignKey (f => f. ID de proveedor) .WillCascadeOnDelete (false); Eliminé algunas propiedades simples que no se aplican a este problema de las clases, pero no hay referencias entre las clases. Solo hay uno-a-muchos desde Proveedor a Contactos. –

Respuesta

6

Esta asignación se mal (estoy refiriendo a su comentario a continuación su pregunta):

modelBuilder.Entity<Contact>() 
    .HasRequired(r => r.Supplier) 
    .WithMany() 
    .HasForeignKey(f => f.SupplierId) 
    .WillCascadeOnDelete(false); 

Es necesario:

modelBuilder.Entity<Contact>() 
    .HasRequired(r => r.Supplier) 
    .WithMany(s => s.Contacts) 
    .HasForeignKey(f => f.SupplierId) 
    .WillCascadeOnDelete(false); 

lo contrario de EF considerará Supplier.Contacts como una propiedad que pertenece a la navegación otra y segunda relación uno a muchos entre Supplier y Contact - y eso introduce la segunda clave externa.

+0

¡Gracias! Ese fue el culpable. –

+0

Usted ha señalado exactamente el mismo error que cometí. ¡Gracias! –

Cuestiones relacionadas