【问题标题】:How to insert data into a table with composite key from Multiple Tables in ASP.NET MVC如何从 ASP.NET MVC 中的多个表中将数据插入到具有复合键的表中
【发布时间】:2023-03-21 19:23:02
【问题描述】:

这个问题的答案在here

拥有三个表:

Database diagram is here

书籍类:

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

用户类别:

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

还有 UserBookComments 类:

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

“书籍”表是一个已保存的数据库。每个用户都可以对每本书发表评论,我想要一个视图模型来保存书籍中的所有数据及其 cmets。

UserBookComment 上的主键是复合的,在 UserID 和 BookID 上。

我使用了 EF Code First,我的 DBModel 上下文类看起来是这样的:

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);
    }
}
  • 我想知道如何使用 ViewModel 类保存 cmets 并显示 [标题、类别、发布日期和 cmets] 的整个列表?

【问题讨论】:

  • 明确地说,您是否正在寻找 BookEntities 类中的方法来将记录插入到 UserBookComment 表中?
  • @svek 是的,这是正确的。

标签: entity-framework asp.net-mvc-5 foreign-keys many-to-many composite-primary-key


【解决方案1】:

正如您在 cmets 中所问的那样,我已经提供了通过在 BookEntities 类中添加方法来将记录插入到 UserBookComment 表中的方法。

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

根据您提供的信息,我假设您的 UserBookComment 课程看起来像这样

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

【讨论】:

  • 根据我的SQL脚本,UserBookComment还有另外两个字段:public virtual Books Books {get;set;} --- public virtual Users Users {get;设置;}
  • @Joey - 您最好在问题中提供课程。但是,对于在请求的表中创建记录,这个答案应该足够了,不是吗?
  • 我可以通过使用代码优先 EF 来配置多对多关系,并且我完全更新了我的问题。有cmets吗?
  • 你的问题现在完全不同了!!!显然,我的回答现在不适用于...我可以理解您改变了主意,但是当问题达到 180 时,社区不会欣赏它。您应该打开一个新问题。
【解决方案2】:

看起来您正在使用实体框架。要创建复合键,只需在两个属性的 Key 属性上。要控制键顺序,请使用列属性。应该使用模型中的名称自动修复引用,或者尝试在实体框架外键上搜索。对不起,我现在没有链接。

对于视图模型,不要忘记在语句中使用 include。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 2013-11-08
    • 2017-10-06
    • 1970-01-01
    • 2012-08-24
    相关资源
    最近更新 更多