2012-08-07 14 views
6

Sto utilizzando EF Code First (4.3.1) su un progetto ASP.NET MVC 3 personale, con un modello di dominio molto semplice, e sono quasi al punto in cui EF genererà lo schema DB nel modo in cui lo voglio.Primo codice struttura entità - Denominazione colonna proprietà virtuale

Il modello di dominio ha due classi: Painting e Gallery. Ogni Painting appartiene a un singolo Gallery e lo Gallery ha due proprietà virtuali che puntano a Painting: uno per indicare quale del dipinto è l'immagine di copertina e uno per quale dei dipinti è l'immagine del dispositivo di scorrimento visualizzata nella pagina iniziale.

Le classi sono le seguenti. Ho rimosso alcune annotazioni e proprietà irrilevanti per renderlo leggibile.

public class Gallery 
{ 
    public Gallery() 
    { 
     Paintings = new List<Painting>(); 
    } 

    [ScaffoldColumn(false)] 
    [Key] 
    public int GalleryId { get; set; } 

    public string Name { get; set; } 

    [ScaffoldColumn(false)] 
    [Column("LaCover")] 
    public Painting Cover { get; set; } 

    [ScaffoldColumn(false)] 
    [Column("ElSlider")] 
    public Painting Slider { get; set; } 

    [ScaffoldColumn(false)] 
    public virtual List<Painting> Paintings { get; set; } 
} 

e pittura:

public class Painting 
{ 
    [ScaffoldColumn(false)] 
    [Key] 
    public int PaintingId { get; set; } 

    public string Name { get; set; } 

    public int GalleryId { get; set; } 

    [Column("GalleryId")] 
    [ForeignKey("GalleryId")] 
    [InverseProperty("Paintings")] 
    public virtual Gallery Gallery { get; set; } 

    public string Filename { get; set; } 
} 

Esso genera uno schema db corretta per entrambe le classi e le sue relazioni, l'unico piccolo problema che ho è che non ho trovato un modo per controllare i nomi delle colonne dà alle proprietà virtuali di Cover e Slider nella tabella Gallery.

Li chiamerà Cover_PaintingId e Slider_PaintingId.

Ho provato a utilizzare l'attributo [Column("columnNameHere")], ma questo non ha alcun effetto. Come in "Ho digitato una certa parola non correlata e non si è presentata nello schema".

Mi piacerebbe chiamarlo CoverPaintingId, senza il carattere di sottolineatura.

Qualsiasi aiuto è molto apprezzato. Grazie

risposta

6

L'attributo ForeignKey consente di definire la proprietà che agirà come chiave esterna se si vuole che esistono all'interno tuo modello:

[ForeignKey("CoverPaintingId")] 
public virtual Painting Cover { get; set; } 
public int? CoverPaintingId { get; set; } 

Nota si può mettere l'attributo sia sulla proprietà virtuale sul estera chiave - basta specificare il nome dell '"altro".

Tuttavia, poiché si avranno due relazioni tra lo stesso insieme di entità, non sarà possibile farlo senza disabilitare le eliminazioni di Cascading su uno o entrambi. Questo può essere fatto solo usando lo Fluent Configuration API.

public class Gallery 
{ 
    public int GalleryId { get; set; } 

    [ForeignKey("CoverPaintingId")] 
    public virtual Painting Cover { get; set; } 
    public int? CoverPaintingId { get; set; } 

    [ForeignKey("SliderPaintingId")] 
    public virtual Painting Slider { get; set; } 
    public int? SliderPaintingId { get; set; } 

} 

public class Painting 
{ 
    public int PaintingId { get; set; } 
} 

public class MyContext : DbContext 
{ 
    public DbSet<Gallery> Galleries { get; set; } 
    public DbSet<Painting> Paintins { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Gallery>().HasOptional(g => g.Cover).WithMany().WillCascadeOnDelete(false); 
     modelBuilder.Entity<Gallery>().HasOptional(g => g.Slider).WithMany().WillCascadeOnDelete(false); 
    } 
} 

Se non si desidera che le proprietà di chiave esterna di esistere nel modello di codice, è anche possibile configurare questi usando .Map(...) prima della. WillCascadeOnDelete(false) parte dell'API invece di utilizzare ForeignKey. Io preferisco usare la chiave esterna, ma ecco come il codice apparirebbe se si voleva fare in questo modo:

public class Gallery 
{ 
    public int GalleryId { get; set; } 
    public virtual Painting Cover { get; set; } 
    public virtual Painting Slider { get; set; } 
} 

public class Painting 
{ 
    public int PaintingId { get; set; } 
} 

public class MyContext : DbContext 
{ 
    public DbSet<Gallery> Galleries { get; set; } 
    public DbSet<Painting> Paintins { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Gallery>().HasOptional(g => g.Cover).WithMany().Map(m => m.MapKey("CoverPaintingId")).WillCascadeOnDelete(false); 
     modelBuilder.Entity<Gallery>().HasOptional(g => g.Slider).WithMany().Map(m => m.MapKey("SliderPaintingId")).WillCascadeOnDelete(false); 
    } 
} 
+0

Ho provato anche a Richard, ma ho ricevuto il seguente errore: L'introduzione del vincolo FOREIGN KEY "FK_Galleries_Paintings_CoverPaintingId" nella tabella "Gallerie" può causare cicli o più percorsi a cascata. Specificare ON DELETE NO ACTION o ON UPDATE NO ACTION o modificare altri vincoli FOREIGN KEY. Impossibile creare il vincolo. Vedi errori precedenti. – GR7

+0

Ah sì, ho dimenticato che avresti ottenuto con più relazioni. Aggiornato la risposta per spiegare come aggirare il problema. – Richard

+0

Richard. Fatto qualche progresso, grazie, ma ora sto ricevendo il seguente errore: Il ForeignKeyAttribute sulla proprietà 'Cover' sul tipo 'ap.Models.Gallery' non è valido. Il nome della chiave esterna "CoverPaintingId" non è stato trovato nel tipo dipendente "ap.Models.Painting". Il valore Nome dovrebbe essere un elenco separato da virgole di nomi di proprietà di chiave esterna. E da quello che dice l'errore, capisco che dovrei creare una proprietà CoverPaintingId su Painting? Non sarebbe quello che volevo, dal momento che voglio solo nominare la colonna che è già stata creata su Gallery come "CoverPaintingId" invece di "Cover_PaintingId" – GR7

0

potresti provare a utilizzare la decorazione [inverseproperty] per ottenere ciò.

+0

Clot, credo sia per quando si hanno rapporti invertiti e di dire EF non creare doppie relazioni FK . In realtà sto usando questo, ma per la proprietà Paint nella classe Gallery. InverseProperty non funziona per quello che voglio fare.Ho bisogno di quelle colonne nella Gallery, voglio solo nominarle diversamente. – GR7

Problemi correlati