我们可以在实体框架中拥有没有主键的表吗?

时间:2013-03-13 09:22:55

标签: c# entity-framework

我刚刚从msdn练习代码第一个新的数据库实体框架,我想知道是否可以在代码中创建一个没有主键的表第一个新的数据库EF?

6 个答案:

答案 0 :(得分:33)

EF可以与数据库做什么,以及数据库可以做什么有很大的不同。

大多数数据库允许表没有主键。大多数数据库还允许表没有聚簇索引/索引组织表(或者它是其他数据库系统中的特定术语)。

这没有任何问题,并且不应该说没有PK的桌子是个坏主意。

与往常一样,它依赖于特定表的需求和用法。例如一个日志表,不需要PK。它永远不会被用作FK,那么它有什么用?

最重要的是,EF不支持没有开箱即用密钥的表,有一些奇怪的解决方法,但我所看到的都不够好。这太遗憾了。

答案 1 :(得分:21)

不,你不能,因为实体框架需要知道在进行更新或删除操作时跟踪对象的密钥。

无论如何,拥有一张没有PrimaryKey的桌子不是一个好主意

答案 2 :(得分:10)

  1. 实体框架必须在对表格建模的实体(POCO类)上标识密钥。
  2. 您在Entity Framework中定义的密钥 NOT 需要存在于基础数据库中(例如sql表)。
  3. 如果您的SQL表没有主键,您仍然可以在Entity Framework中对其进行建模,您只需要为该实体定义一个键。选择实体上的一个或多个(可能是所有)列,这些列在组合时将唯一标识实体集合中的该实例。请注意,这仅对更新或删除实体很重要,因为它们需要与该集合中的其他实体进行唯一标识,以定位更改。查找/选择和添加/插入不需要这种一致性。

答案 3 :(得分:6)

有时添加PK是不可能的,因为它可以是只读的,必须使用的客户端的超级保护数据库。 即使在SELECT操作上,EF也会抛出异常。当我遇到这个问题时,我能够像这样解决它(名字是人为的):

drawImage

在上下文的代码文件中:

[Table( "WeirdTable", Schema = "SomeSchema" )]
public class WeirdTable
{
    [Column( "ID1" )]
    public int Id1 { get; set; }

    [Column( "ID2" )]
    public int Id2 { get; set; }
}

所以基本上你只需要指定哪些列可以是主键。

答案 4 :(得分:4)

从.NET Core 2.1开始,EF Core支持不带主键的模型。
这是通过查询类型而不是自然类型的概念来实现的。
参见https://docs.microsoft.com/en-us/ef/core/modeling/query-types

  

查询类型的一些主要使用方案是:

     
      
  • 用作临时FromSql()查询的返回类型。
  •   
  • 映射到数据库视图。
  •   
  • 映射到未定义主键的表。
  •   
  • 映射到模型中定义的查询。
  •   
尽管

查询类型有限制。它们不能在数据库中插入,更新或删除。并且它们仅对导航属性提供有限的支持。

答案 5 :(得分:2)

EF.Core 5将具有[Keyless]属性,允许具有不带PK的实体。 但是它仍在开发中。

EF.Core 5 what's new