0

Antwort auf diese Frage einzufügen bei hereWie Daten in eine Tabelle mit zusammengesetzten Schlüsseln aus mehreren Tabellen in ASP.NET MVC

mit drei Tabellen gefunden :

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.ComponentModel.DataAnnotations.Schema; 
using System.Data.Entity.Spatial; 

public partial class Books 
{ 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public Books() 
    { 
     UserBookComments = new HashSet<UserBookComments>(); 
    } 

    [Key] 
    public int BookID { get; set; } 

    [Required] 
    [StringLength(255)] 
    public string Title { get; set; } 

    [Required] 
    [StringLength(255)] 
    public string Category { get; set; } 

    [Column(TypeName = "date")] 
    public DateTime PublishDate { get; set; } 

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<UserBookComments> UserBookComments { get; set; } 
} 

Benutzerklasse:

public partial class Users 
{ 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public Users() 
    { 
     UserBookComments = new HashSet<UserBookComments>(); 
    } 

    [Key] 
    public int UserID { get; set; } 

    [Required] 
    [StringLength(255)] 
    public string UserName { get; set; } 

    [Required] 
    [StringLength(255)] 
    public string Password { get; set; } 

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<UserBookComments> UserBookComments { get; set; } 
} 

Und die UserBookComments Klasse:

using System.ComponentModel.DataAnnotations; 
using System.ComponentModel.DataAnnotations.Schema; 
using System.Data.Entity.Spatial; 

public partial class UserBookComments 
{ 
    [Key] 
    [Column(Order = 0)] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int UserID { get; set; } 

    [Key] 
    [Column(Order = 1)] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int BookID { get; set; } 

    public int? Comments { get; set; } 

    public virtual Bookss Bookss { get; set; } 

    public virtual Users Users { get; set; } 
} 

Die Tabelle "Bücher" ist eine bereits gespeicherte Datenbank. Jeder Benutzer kann für jedes Buch kommentieren und ich möchte ein Ansichtsmodell, das alle Daten aus Büchern mit ihren Kommentaren enthält.

Der primäre Schlüssel in UserBookComment wäre zusammengesetzt, auf UserID und BookID.

verwendete ich EF-Code Erste und meine DBModel Kontextklasse sieht so:

using System.Data.Entity; 
using System.ComponentModel.DataAnnotations.Schema; 
using System.Linq; 

public partial class DbModel : DbContext 
{ 
    public DbModel() 
     : base("name=DbModel") 
    { 
    } 

    public virtual DbSet<Books> Books { get; set; } 
    public virtual DbSet<UserBookComments> UserBookComments { get; set; } 
    public virtual DbSet<Users> Users { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Books>() 
      .Property(e => e.Category) 
      .IsUnicode(false); 

     modelBuilder.Entity<Books>() 
      .HasMany(e => e.UserBookComments) 
      .WithRequired(e => e.Books) 
      .WillCascadeOnDelete(false); 

     modelBuilder.Entity<Users>() 
      .HasMany(e => e.UserBookComments) 
      .WithRequired(e => e.Users) 
      .WillCascadeOnDelete(false); 
    } 
} 
  • Ich frage mich, wie Kommentare zu speichern und ganze Liste von [Titel, Kategorie, veröffentlichen Datum und Kommentare] mit einem Ansichtsmodell angezeigt werden Klasse?
+0

Um klar zu sein, suchen Sie nach einer Methode innerhalb der 'BookEntities' Klasse, um einen Datensatz in die' UserBookComment' Tabelle einzufügen? – Svek

+0

@svek Ja, das ist richtig. – Joey

Antwort

0

Wie Sie in den Kommentaren gefragt, ich habe die Art und Weise zur Verfügung gestellt durch Zugabe eines Verfahrens in die BookEntities Klasse einen Datensatz in die UserBookComment Tabelle einzufügen.

public partial class BooksEntities : DbContext 
{ 
    public virtual DbSet<Books> Books { get; set; } 
    public virtual DbSet<UserBookComment> UserBookComments { get; set; } 
    public virtual DbSet<Users> Users { get; set; } 

    public void AddComment(int userId, int bookId, string comment) 
    { 
     var userBookComment = new UserBookComment() 
     { 
      UserId = userId, 
      BookId = bookId, 
      Comment = comment 
     }; 

     this.AddComment(userBookComment); 
    } 

    public void AddComment(UserBookComment userBookComment) 
    { 
     this.UserBookComment.Add(userBookComment); 
     this.UserBookComment.SaveChanges(); 
    } 
} 

Ich nahm auf der Grundlage Ihrer zur Verfügung gestellten Informationen, dass Ihre UserBookComment Klasse wie dieses

Sieht
public class UserBookComment 
{ 
    public int UserId { get; set; } 
    public int BookId { get; set; } 
    public string Comment { get; set; } 
} 
+0

Gemäß meinen SQL-Skripten hat das UserBookComment zwei andere Felder: public virtual Books {get; set;} --- public virtual Users Benutzer {get; set;} – Joey

+0

@Joey - Es wäre am besten für Sie, die Klasse in Ihrer Frage bereitzustellen. Diese Antwort sollte jedoch ausreichen, um einen Datensatz in der angeforderten Tabelle zu erstellen, nein? – Svek

+0

Ich könnte die Viele-Viele-Beziehung konfigurieren, indem ich Code zuerst EF benutze, und ich habe meine Frage komplett aktualisiert. Irgendwelche Kommentare? – Joey

0

sah aus wie Sie Entity Framework verwenden. So erstellen Sie einen zusammengesetzten Schlüssel, nur bei dem Schlüsselattribut für beide Eigenschaften. Um die Schlüsselreihenfolge zu steuern, verwenden Sie die Spaltenattribute. Die Referenzierung sollte automatisch mit den Namen im Modell oder mit dem Fremdschlüssel des Entitätsframeworks gegoogelt werden. Es tut mir leid, dass ich den Link gerade nicht habe.

Für das View-Modell, nur nicht zu verwenden, um in der Anweisung zu verwenden.

Verwandte Themen