不幸的是,我无法添加脚手架,特别是在关系过多的情况下。
我遇到问题的三种情况。
情况1: 如果我选择作为“数据上下文类”,则为“ OwnContext(Test.Model)case 1 screenshot 1 我收到错误消息:运行所选代码生成器时出错。没有为此对象定义无参数构造函数。 case 1 screenshot 2 我在这里做错了什么?我想了解这个问题。
案例2: 如果我单击带有加号的图标时选择一个新的“数据上下文类”。 case 2 screenshot 1和case 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});
我在这里做错了什么?我想了解这个问题。
谢谢您的帮助。
答案 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});
}