当前位置: 首页 > 知识库问答 >
问题:

ASP.NET MVC-无法在对象中插入重复的键行

夏侯弘量
2023-03-14

我有一个实体框架核心的问题。我有2个模型:category.cs

    public int Id { get; set; }
    [DisplayName("Category | ")]
    [Required(ErrorMessage = "Category Name is Required")]
    public string CategoryName { get; set; }

和LibraryItem.cs

    public int Id { get; set; }

    [DisplayName("Category Id")]
    [Required(ErrorMessage = "Category Id is Required")]
    public int CategoryId { get; set; }

    public Category Category { get; set; }
    [Required(ErrorMessage = "Title is Required")]
    public string Title { get; set; }

    [DisplayName("Author, Speaker or Director")]
    [Required(ErrorMessage = "Creator of the media is required")]
    public string Author { get; set; }

    public int? Pages { get; set; }

    [DisplayName("DVD or Audiobook Length")]
    public int? RunTimeMinutes { get; set; }

    [DisplayName("Available to borrow")]
    public bool IsBorrowable { get; set; }

    [DisplayName("Name of Borrower")]
    public string Borrower { get; set; }

    [DisplayName("Date of the Borrow")]
    public DateTime? date { get; set; }

    [DisplayName("Type of Media")]
    [Required(ErrorMessage = "Type of Media is Required")]
    public string Type { get; set; }

LibraryItem有一个外键CategoryId,它是Category表的主键。我想用相同的外键添加两个项目。所以这两个项目属于同一类别。但当我尝试添加具有相同CategoryId的另一个时,会出现以下错误

cannot insert duplicate key row in object

有人知道是什么导致了这个问题吗?多谢!

共有2个答案

傅俊德
2023-03-14

您必须通过在每个类上添加导航属性,让EF知道这两个实体以一对多的关系相关:

    public class Category {
        ...
        
        public virtual ICollection<LibraryItem> LibraryItems {get; set;}
    }


    public class LibraryItem {
        ...
        
        [DisplayName("Category Id")]
        [Required(ErrorMessage = "Category Id is Required")]
        public int CategoryId { get; set; }

        public Category Category { get; set; }
    }

如果添加了导航属性,则可以使用Fluent API手动配置DbContext的OnModelCreating方法中的关系

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<LibraryItem>()
            .HasOne(l => l.Category)
            .WithMany(c => c.LibraryItems);
    }
凤晨朗
2023-03-14

问题是您创建了一对一的关系,但您需要一对多

您必须修复您的类别类:

    public int Id { get; set; }
    [DisplayName("Category | ")]
    [Required(ErrorMessage = "Category Name is Required")]
    public string CategoryName { get; set; }

    [InverseProperty(nameof(Library.Category))]
    public virtual ICollection<LibraryItem> LibraryItems {get; set:}

修复后,您将不得不再次进行迁移

 类似资料:
  • 我正在使用Envers来审核表,但它正在为未知/不存在的表创建一些审核表。它看起来像多对一关系的多对多关系审计表。 这是对的吗?如果是,为什么? 但当我尝试删除和HorarioFixo时,我遇到了一个错误。 我收到的错误: 这是SQL重复: 所有这些都是代码的一部分。如果你需要更多,请留下评论。 我的班级: 我的映射: 新罕布什尔州和恩维尔斯配置:

  • 我定义了2个具有单向一对多关系的实体: 在command.class中: 在StockDetails.class中: null

  • 问题内容: 我了解存在和。但是,当有重复的键时,我想对临时表进行操作,以记录已违反的唯一键的记录,以便将其输出给用户。 有什么办法可以做吗?如果有帮助,我正在尝试进行批量插入。 问题答案: 使用,您不能插入到另一个表中-也没有可用的替代功能。 您可以通过两种自定义/替代方式来实现此目的: 使用对此问题的可接受答案中概述的:将MySQL ON DUPLICATE KEY插入到审计表或日志表中 创建一

  • 但显然没多大意义,不是吗?大多数实现可能使用hashtable,所以无论如何都要重写它。

  • 我的意图是创建4个Emp对象。2个对象(e1和e2)具有相同的哈希代码。因此,当插入e1(插入在e2之后)时,hashmap会意识到具有相同哈希值的对象已经存在(对象e2)。然后它会将槽中所有对象的键与相同的哈希值进行比较。如果它找到一个具有匹配键的对象(通过调用下面Emp类的equals方法),它将用新值替换旧值。 下面请看一下测试代码: 我期望的输出:替换的记录名称:Terry,年龄:60名称

  • 问题内容: 关于create table命令上的重复键,我收到1022错误。看完查询后,我不知道在哪里进行复制。有人可以看到吗? 问题答案: 您很可能已经在名称或数据库中具有约束。如果是这样,只需重命名约束即可。 约束对于整个数据库必须是唯一的,而不仅仅是对要创建/更改的特定表。 要找出约束当前在哪里使用,可以使用以下查询: