C# 是否可以在没有主键的表上使用实体框架核心和现有数据库?

C# 是否可以在没有主键的表上使用实体框架核心和现有数据库?,c#,sql-server,entity-framework-core,C#,Sql Server,Entity Framework Core,我正在尝试将实体框架核心与现有数据库一起使用。这个数据库有几个表没有设置主键,因为如果设置了主键,其他进程(在我构建的应用程序范围之外)将中断 是否可以创建没有主键的表模型 我目前正在使用: Microsoft.EntityFrameworkCore-版本2.0.1 Microsoft.EntityFrameworkCore.SqlServer-版本2.0.1 Microsoft.EntityFrameworkCore.SqlServer.Design-版本 Microsoft.EntityF

我正在尝试将实体框架核心与现有数据库一起使用。这个数据库有几个表没有设置主键,因为如果设置了主键,其他进程(在我构建的应用程序范围之外)将中断

是否可以创建没有主键的表模型

我目前正在使用:

  • Microsoft.EntityFrameworkCore-版本2.0.1
  • Microsoft.EntityFrameworkCore.SqlServer-版本2.0.1
  • Microsoft.EntityFrameworkCore.SqlServer.Design-版本
  • Microsoft.EntityFrameworkCore.Tools-版本2.0.1
  • Microsoft.EntityFrameworkCore.Tools.DotNet-版本2.0.0
我在运行下面的命令时遇到此错误
“无法为表“…”生成实体类型。请查看警告消息。”

我正在运行的命令:

脚手架数据库上下文 “服务器=…myservernamehere…;数据库=…mydbnamehere…;可信连接=True;” Microsoft.EntityFrameworkCore.SqlServer-OutputDir模型


如果没有主键,Scafford将无法工作。然而,有一个解决办法。至少在2.2.0中,我不能肯定这在旧版本中是否有效

  • 在为数据库构建DBContext文件之后

  • 至少有一列必须是唯一的数据

  • 您需要为表创建一个模型类,其中包含您关心的所有列。 最好使用与表相同的名称和数据类型

  • 创建您的数据库集

    public virtual DbSet<Model of table>  { get; set; }
    

另一个解决方法是使用EF Core 3.0创建一个临时项目,并进行脚手架搭建,因为在此版本上可以搭建一个没有主键的数据库。然后可以将这些类复制到旧项目中。您可能需要一些小的更改,但这将节省大量使用大表的工作,或者如果您有许多没有主键的表,您需要为项目保留EF Core版本。

我已经使用dapper使用裸查询完成了这项工作,因为EF Core能够执行裸查询,是的,这是可能的。看看它的价值,“是否可能”不是一个富有成效的问题。只要有足够的时间、金钱和咖啡因,计算中的任何事情都是可能的。主键只表示表的列中不能存在重复的值。如果没有主键,则列中可能存在重复值。因此,您可以创建没有主键的模型。just不是表之间的一对一映射。@jdweng在运行Scaffold DbContext命令“Server=…;Database=…;Trusted_Connection=True;”时,我得到“无法为表生成实体类型…”Microsoft.EntityFrameworkCore.SqlServer-OutputDirModels@RobertHarvey您是否能够为没有主键的表生成具有EF Core的实体?您不必有一个总是唯一的列。您还可以使用上面的
HasKey
方法,指定一组列,这些列组合在一起将是唯一的。
modelBuilder.Entity<Model of table>(entity =>
    {
        entity.HasKey(e => e.{Unique column});
        entity.ToTable("Table's Name");
    }
)