9

Nel mio progetto AspNet MVC 3 quando provo a impalcare un'entità che ha una relazione One to Zero o One con un'altra entità ottengo "Un elemento con stesso indice è già stato aggiunto "errore.MVC Scaffolding ed EF 'One To Zero o One' error error

In sostanza ciò si verifica quando la chiave primaria della tabella correlata è anche una chiave esterna.

Al momento il mio soluzione è

  1. Aggiungi una colonna ID alla tabella correlata e renderlo la chiave primaria

  2. Aggiungi chiave Unico per la colonna di chiave esterna.

Il problema di questo è che EF genererà una proprietà navigazione ICollection per la relativa entità invece di una struttura del tipo di entità correlata (che posso impostato nullo in caso zero entità collegate)

È un bug noto?

Sto facendo qualcosa di sbagliato?

C'è un lavoro migliore per sbarazzarsi della proprietà di navigazione ICollection?

+0

Si sta utilizzando la generazione del codice DbContext? –

+0

Sto usando DbContext in EF 4.3 e ho lo stesso problema. La mia app utilizza Code First per generare il DB. Sembra che in Mike

+0

È necessario utilizzare la chiave esterna della tabella correlata anche come chiave primaria: è l'unico modo per implementare la relazione 1- (0,1). –

risposta

3

Vedere la mia risposta su questa questione:

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?

Questo è il codice di esempio con la configurazione corretta.

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(); 
    } 
} 

È inoltre possibile raggiungere questo obiettivo con DataAnnotations, ma io in genere preferisco tenere i miei modelli di entità come POCOs.

+0

Grazie e scusa non ho avuto il tempo di guardarlo ma suona bene. Ci scusiamo per il ritardo nell'accettazione. – NVM

+0

Sempre contento di essere utile;) – WDRust

Problemi correlati