Asp.net核心使用实体框架添加了脚手架的剃须刀页面:运行所选代码生成器时发生错误

时间:2018-08-18 12:54:53

标签: c# asp.net entity-framework razor-pages

不幸的是,我无法添加脚手架,特别是在关系过多的情况下。

我遇到问题的三种情况。

情况1: 如果我选择作为“数据上下文类”,则为“ OwnContext(Test.Model)case 1 screenshot 1 我收到错误消息:运行所选代码生成器时出错。没有为此对象定义无参数构造函数。 case 1 screenshot 2 我在这里做错了什么?我想了解这个问题。

案例2: 如果我单击带有加号的图标时选择一个新的“数据上下文类”。 case 2 screenshot 1case 2 screenshot 2 我收到了错误消息:运行所选代码生成器时出错:实体类型BookCategory具有定义了数据注释的复合主键。要设置复合主键,请使用fluent API。 case 2 screenshot 3

我不明白为什么会出现此错误消息。因为我使用Fluent api来表示多对多关系。

两种情况下的我的模型(在Model.cs文件中):

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Microsoft.EntityFrameworkCore;


namespace Test.Model
{
    public class OwnContext : DbContext
    {
        public OwnContext(DbContextOptions<OwnContext> options)
            : base(options)
        {

        }

        public DbSet<Test.Model.Book> Book { get; set; }
        public DbSet<Test.Model.Category> Category { get; set; }
        public DbSet<Test.Model.BookCategory> BookCategory { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<BookCategory>().HasKey(c => new {c.BookId, c.CategoryId});
            modelBuilder.Entity<Book>().HasKey(c => c.BookId);
            modelBuilder.Entity<Category>().HasKey(c => c.CategoryId);
        }
    }

    public class Book
    {
        [Key]
        public int BookId { get; set; }
        public string Title { get; set; }
        public IList<BookCategory> BookCategories { get; set; }
    }

    public class Category
    {
        [Key]
        public int CategoryId { get; set; }
        public string CategoryName { get; set; }
        public IList<BookCategory> BookCategories { get; set; }
    }

    public class BookCategory
    {
        [Key]
        public int BookId { get; set; }
        public Book Book { get; set; }
        [Key]
        public int CategoryId { get; set; }
        public Category Category { get; set; }
    }

}

情况3: 如果我删除了注解[Key]并使用此模型case 3 screenshot 1

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Microsoft.EntityFrameworkCore;


namespace Test.Model
{
    public class OwnContext : DbContext
    {
        public OwnContext(DbContextOptions<OwnContext> options)
            : base(options)
        {

        }


        public DbSet<Test.Model.Book> Book { get; set; }
        public DbSet<Test.Model.Category> Category { get; set; }
        public DbSet<Test.Model.BookCategory> BookCategory { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<BookCategory>().HasKey(c => new {c.BookId, c.CategoryId});
            modelBuilder.Entity<Book>().HasKey(c => c.BookId);
            modelBuilder.Entity<Category>().HasKey(c => c.CategoryId);
        }
    }

    public class Book
    {
        public int BookId { get; set; }
        public string Title { get; set; }
        public IList<BookCategory> BookCategories { get; set; }
    }

    public class Category
    {
        public int CategoryId { get; set; }
        public string CategoryName { get; set; }
        public IList<BookCategory> BookCategories { get; set; }
    }

    public class BookCategory
    {
        public int BookId { get; set; }
        public Book Book { get; set; }
        public int CategoryId { get; set; }
        public Category Category { get; set; }
    }

}

我收到以下错误消息:运行所选代码生成器时发生错误:实体类型BookCategory需要定义的主键。 case 3 screenshot 2

我不明白问题所在。因为我用这段代码定义了主键。

modelBuilder.Entity<BookCategory>().HasKey(c => new {c.BookId, c.CategoryId});

我在这里做错了什么?我想了解这个问题。

谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我认为您需要Fluent API的重写部分: Warning from my own code: CS0114

“将复合PK指定给EF Core的唯一方法是使用流畅的API。” (Razor Pages with EF Core in ASP.NET Core - Data Model - 5 of 8 > Update the DB context

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<BookCategory>().HasKey(c => new {c.BookId, c.CategoryId});
}