2016-07-24 7 views
0

Ich benutze ASP.NET MVC, um eine Beispiel-Webanwendung zu erstellen, und ich möchte eine Viele-zu-Viele-Beziehung konfigurieren. Ich habe Produkte und Transaktionen. Ich möchte, dass jede Transaktion ein oder mehrere Produkte enthält. Ich habe eine erste Klassen-Code definiert, wie folgende:Konfigurieren der Viele-zu-Viele-Beziehung in EntityFramework

public class Product 
{ 
    public int ProductID { get; set; } 

    public string Name { get; set; } 

} 

public class Transaction 
{ 
    public int TransactionID { get; set; } 

    public virtual ICollection<Product> Products { get; set; } 

} 

Dann habe ich ein paar Sachen zu meinem ApplicationDbContext hinzugefügt, und schließlich sieht es wie folgt aus:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{ 
    public ApplicationDbContext() 
     : base("DefaultConnection", throwIfV1Schema: false) 
    { 
    } 

    public static ApplicationDbContext Create() 
    { 
     return new ApplicationDbContext(); 
    } 

    //protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    //{ 
    // modelBuilder.Entity<Transaction>().HasMany(x => x.Products).WithMany(); 
    //} 

    public DbSet<Product> Products { get; set; } 

    public DbSet<Transaction> Transactions { get; set; } 
} 

Danach ich Migrationen aktiviert, und fügte hinzu, einige Testdaten, die in meiner Datenbank angezeigt werden sollen. Die Testdaten finden Sie unten:

protected override void Seed(MyApp.Models.ApplicationDbContext context) 
{ 
    var pr = new List<Product>(); 
    pr.Add(new Product { Name = "Book" }); 
    pr.Add(new Product { Name = "Table" }); 
    pr.Add(new Product { Name = "Chair" }); 

    pr.ForEach(i => context.Products.AddOrUpdate(p => p.Name, i)); 
    context.SaveChanges(); 

    context.Transactions.AddOrUpdate(
     t => t.Products, 
     new Transaction { Products = new List<Product>(pr.Where(p => p.Name == "Book" || p.Name == "Table")) }, 
     new Transaction 
     { 
      Products = new List<Product>(pr.Where(p => p.Name == "Chair" || p.Name == "Book" || p.Name == "Table")) 
     } 
    ); 

    context.SaveChanges(); 
} 

Dann habe ich eine neue Migration erstellt und die Datenbank aktualisiert. Aber, als ich die Tabellen überprüfte, gab es nur TransactionID Spalte in der Tabelle der Transaktionen, und dort war nicht die Products Spalte, die die IDs der Produkte hält. Stattdessen gab es eine neue Spalte in der Produkttabelle mit dem Namen Transaction_TransactionID, die jedoch die ID der letzten Transaktion enthielt, zu der das Produkt gehörte. Also, die Beziehung ist nicht ganz richtig.

Wie zu sehen, habe ich auch eine Methode auskommentiert, wo ich manuell die Viele-zu-Viele-Beziehung angeben wollte. Aber, wenn ich es Kommentar- und versuchen, die Datenbank zu aktualisieren, erhalte ich ein paar Fehler, von denen einer von ihnen ist:

IdentityUserRole: EntityType ‚IdentityUserRole‘ hat keinen Schlüssel definiert. Definieren Sie den Schlüssel für diesen EntityType

Jede Idee zu erreichen, was ich will? Im späteren Teil des Projekts muss ich nach Transaktionen suchen und herausfinden, welche Produkte an welchen Transaktionen beteiligt sind.

Antwort

1

Wenn Sie eine Viele-zu-viele-Beziehung erstellen, wird eine dritte Tabelle dafür erstellt, die die Primärschlüssel der beiden Tabellen enthält.

Sie sollten die Viele-zu-viele-Beziehung in der Kontextklasse angeben, wie Sie es im kommentierten Teil getan haben. Aber, wie die ApplicationDbContext erbt von IdentityDbContext Klasse sollten Sie base.OnModelCreating aufrufen, um Modelldefinitionen der base.OnModelCreating als auch anzuwenden.

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Transaction>().HasMany(x => x.Products).WithMany(); 
    base.OnModelCreating(modelBuilder); 
} 
+0

Ja, es hat jetzt funktioniert. Vielen Dank. – typos

+0

Gern geschehen –

Verwandte Themen