【问题标题】:Asp.net core add scaffolded, razor pages using entity framework: there was an error running the selected code generatorAsp.net core 添加脚手架,使用实体框架的剃须刀页面:运行所选代码生成器时出错
【发布时间】:2019-01-25 07:02:52
【问题描述】:

很遗憾,我无法添加脚手架项目,尤其是关系太多。

我遇到了三个问题。

案例 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});

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

感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

    我认为您需要为 Fluent API 设置一个覆盖部分: Warning from my own code: CS0114

    “为 EF Core 指定复合 PK 的唯一方法是使用 fluent 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});
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-24
      • 2021-12-26
      • 2015-05-05
      • 2017-11-16
      • 2017-10-15
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      相关资源
      最近更新 更多