2012-12-07 8 views
13

Sto utilizzando EntityFramework versione 5.0 nel progetto WinForms, .net 4.5.Cosa devo aggiungere alla funzione OnModelCreating (DbModelBuilder modelBuilder) per definire le relazioni tra persona e ruolo?

ho creato 2 per me Enti importanti

public class Role 
    { 
     [Key] 
     [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public bool StockPermission { get; set; } 
     public bool ItemPermission { get; set; } 
     public bool OrderPermission { get; set; } 
     public bool PersonPermission { get; set; } 
     public bool StatisticPermission { get; set; } 
    } 

    public class Person 
    { 
     [Key] 
     [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
     public int Id { get; set; } 
     public String Name { get; set; } 
     public String Nickname { get; set; } 
     public String Contact { get; set; } 
     public System.DateTime Created { get; set; } 
     public String Pincode { get; set; } 

     public virtual ICollection<Role> Role { get; set; } 
     public virtual Person Creator { get; set; } 
    } 

e di classe DbContext:

public class SusibarDbContext : DbContext 
    { 
     public DbSet<Entity.Role> Roles { get; set; } 
     public DbSet<Entity.Person> Persons { get; set; } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      //base.OnModelCreating(modelBuilder); 
     } 
    } 

per favore, mi potete aiutare quello che ho bisogno di aggiungere in OnModelCreating(DbModelBuilder modelBuilder) funzione per definire le relazioni tra persona e Ruolo?

La persona può avere molti ruoli (ma non può essere null), diverse persone possono avere lo stesso ruolo/i.

persona può avere un "creatore" Person (può essere nullo), diverse persone possono avere lo stesso "creatore"

Se potesse essere così gentile, mi consigliare soluzione :-(

+0

Ok, l'ho risolto! tra pochi minuti aggiungerò la soluzione (prima il pranzo) – eCorke

risposta

13

Se si desidera utilizzare l'API Fluent per questo, consultare this topic da MSDN. È necessario utilizzare la relazione Molti-a-molti e EF creerà una tabella richiesta per il caso in cui la Persona può avere più ruoli e più ruoli. Qualcosa del genere:

modelBuilder.Entity<Person>().HasMany(x => x.Roles).WithMany(); 

Inoltre, è possibile creare questa relazione senza utilizzare Fluent API. È necessario creare la proprietà di navigazione ICollection<Person> Persons nella classe Role e EF creerà anche una tabella e una relazione appropriate.

+0

grazie mille, questo è quello che stavo cercando. – eCorke

1

Qualcosa di simile questo dovrebbe fare il lavoro:.

Creare un POCO chiamato PersonRole questo è destinato a modellare il rapporto tra un Person e Role

public class PersonRole 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    public Person Person { get; set; } 
    public Role Role { get; set; } 
} 
012.

Nella classe Person, sostituire:

public virtual ICollection<Role> Role { get; set; } 

con:

public virtual ICollection<PersonRole> PersonRoles { get; set; } 

Se si desidera, è possibile aggiungere il seguente alla classe Role:

public virtual ICollection<PersonRole> PersonRoles { get; set; } 

farlo è facoltativo, sebbene possa essere utile se si desidera esaminare tutto lo People con un particolare Role.

Nel metodo OnModelCreating, utilizzare questo codice per garantire che un PersonRole applicherà non annullabile Person e Role proprietà.

modelBuilder.Entity<PersonRole>().HasRequired(p => p.Person); 
modelBuilder.Entity<PersonRole>().HasRequired(p => p.Role); 

Edit:

La ragione per la creazione del PersonRole POCO è quello di garantire che un Role possono essere riutilizzati attraverso diversi utenti. L'utilizzo dello public virtual ICollection<Role> Role { get; set; } esistente funzionerà, ma probabilmente non funzionerà come previsto.

Con il rapporto public virtual ICollection<Role> Role { get; set; }, cosa EF farà è aumentare la tabella Role con un campo aggiuntivo, ad esempio, PersonId, che sarà utilizzata per collegare una Person al loro Roles. Il problema con questo è chiaro: senza la tabella di collegamento PersonRole, non sarà possibile dare a due persone lo stesso Role.

+0

grazie per il tuo consiglio, ma non penso che questa sia l'idea migliore. Creazione dell'entità di relazione nel modello tipizzato Entità. EntityFramework dovrebbe eliminare i problemi di relazione, non crearne uno nuovo e nuove entità. – eCorke

+0

@eCorke vedere la mia modifica. –

+0

Non c'è un'altra soluzione? Un certo tipo di ambientazione, che un ruolo può avere molte persone (realizzarne uno a molti, ma rendere Person per avere quei ruoli in lista? So come crearlo con entità di realtions, ma ho pensato che questo può Entity Framework creare in backened. – eCorke

1

Sebbene non sia una risposta alla tua domanda direttamente, usa le convenzioni di denominazione EF per evitare Annotaioni e mantenere pulite le classi di entità. Mostrerò 2 situazioni:

One - Molti utilizzando EF Naming Convention

ruolo ha molte persone, in persona ha un ruolo

One - Molti Dove nessuno Convenzione di denominazione esistente (padre-figlio dello stesso tipo)

persona ha molti Creato, persona ha un Creatore)

public class Role 
{ 
    public int RoleId { get; set; } 
    public string Name { get; set; } 
    ... 

    public virtual ICollection<Person> Persons { get; set; } 
} 

public class Person 
{ 
    public int PersonId { get; set; } 
    public int CreatorId { get; set; } 
    public int RoleId { get; set; } 
    ... 

    public virtual Role Role { get; set; } 
    public virtual Person Creator { get; set; } 
    public virtual ICollection<Person> Created { get; set; } 
} 

Per il rapporto creatore-creato nel OnModelCreating:

modelBuilder.Entity<Person>() 
    .HasOptional(p => p.Creator) 
    .WithMany(p => p.Created) 
    .HasForeignKey(p => p.CreatorId); 

Con "ClassName" + "Id" (maiuscole e minuscole), EF assumerà che è la chiave primaria/Identifier automaticamente. La relazione Ruolo-Persona verrà creata automaticamente a causa della mappatura virtuale combinata con il "RoleId" PrimaryKey