【发布时间】:2019-01-25 07:02:52
【问题描述】:
很遗憾,我无法添加脚手架项目,尤其是关系太多。
我遇到了三个问题。
案例 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});
我在这里做错了什么?我想了解这个问题。
感谢您的帮助。
【问题讨论】:
标签: c# asp.net entity-framework razor-pages