【问题标题】:ASP.NET MVC - Cannot insert duplicate key row in objectASP.NET MVC - 无法在对象中插入重复的键行
【发布时间】:2021-06-30 02:26:55
【问题描述】:

我对 Entity Framework Core 有疑问。我有 2 个模型: 分类.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

有谁知道是什么导致了这个问题? 非常感谢!

【问题讨论】:

标签: c# asp.net asp.net-mvc asp.net-core entity-framework-core


【解决方案1】:

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

你必须修复你的类别类:

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

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

【讨论】:

    【解决方案2】:

    您必须通过在每个类上添加导航属性来让 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);
        }
    

    【讨论】:

    • 嗨!谢谢你给我解释,现在很有意义。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 2020-11-27
    • 1970-01-01
    • 2021-08-13
    • 2014-05-04
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多