9

En mi proyecto AspNet MVC 3 cuando intento andamiar una entidad que tiene una relación One to Zero or One con otra entidad obtengo "Un elemento con el el mismo índice ya ha sido agregado "error.MVC Scaffolding y EF 'One to Zero or One' error de relaciones

Básicamente, esto ocurre cuando la clave principal de la tabla relacionada también es una clave externa.

En el momento en que mi solución es

  1. Añadir una columna de ID de la tabla relacionada y lo convierten en la clave principal

  2. Agregar clave única de la columna de clave externa.

El problema con esto es que EF generará una propiedad de navegación ICollection de la entidad relacionada en lugar de sólo una propiedad del tipo de entidad relacionada (que puedo fijar a nulo en caso de cero entidades relacionadas)

¿Es este un error conocido?

¿Estoy haciendo algo mal?

¿Hay un mejor trabajo para deshacerse de la propiedad de navegación ICollection?

+0

¿Está utilizando la generación de código DbContext? –

+0

Estoy usando DbContext en EF 4.3 y tengo el mismo problema. Mi aplicación usa Code First para generar la base de datos. Parece que en Mike

+0

También debe usar la clave externa de la tabla relacionada como clave primaria; es la única forma de implementar la relación 1- (0, 1). –

Respuesta

3

Véase mi respuesta a esta pregunta:

How do I code an optional one-to-one relationship in EF 4.1 code first with lazy loading and the same primary key on both tables?

Ese es el código de ejemplo, con la configuración correcta.

public class ZoneMedia 
{ 
    public int ZoneMediaID { get; set; } 
    public string MediaName { get; set; } 
    public int Width { get; set; } 
    public int Height { get; set; } 

    public virtual ZoneMediaText MediaText { get; set; } 
} 

public class ZoneMediaText 
{ 
    public int ZoneMediaID { get; set; } 
    public string Text { get; set; } 
    public int Color { get; set; } 

    public virtual ZoneMedia ZoneMedia { get; set; } 
} 

public class TestEFDbContext : DbContext 
{ 
    public DbSet<ZoneMedia> ZoneMedia { get; set; } 
    public DbSet<ZoneMediaText> ZoneMediaText { get; set; } 

    protected override void OnModelCreating (DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<ZoneMedia>() 
      .HasOptional(zm => zm.MediaText); 
     modelBuilder.Entity<ZoneMediaText>() 
      .HasKey(zmt => zmt.ZoneMediaID); 
     modelBuilder.Entity<ZoneMediaText>() 
      .HasRequired(zmt => zmt.ZoneMedia) 
      .WithRequiredDependent(zm => zm.MediaText); 

     base.OnModelCreating(modelBuilder); 
    } 
} 
class Program 
{ 
    static void Main (string[] args) 
    { 
     var dbcontext = new TestEFDbContext(); 
     var medias = dbcontext.ZoneMedia.ToList(); 
    } 
} 

También puede lograr esto con DataAnnotations, pero en general prefiero mantener mis modelos de entidades como POCOs.

+0

Gracias y lo siento, no he tenido el tiempo para ver esto, pero suena bien. Lo siento por el retraso en la aceptación. – NVM

+0

Siempre contento de ser útil;) – WDRust