40

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

4

6 回答 6

51

EF 可以对数据库执行的操作与使用数据库可以执行的操作之间存在很大差异。

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

这并没有错,人们不应该说没有 PK 的桌子是个坏主意。

与往常一样,这取决于特定表的需求和使用情况。例如日志表,不需要PK。它永远不会被用作FK,那么它有什么用呢?

最重要的是,EF 不支持没有开箱即用密钥的表,有一些奇怪的解决方法,但我所见过的都不够好。这是一种耻辱。

于 2015-11-02T12:59:48.303 回答
28

不,您不能,因为当您进行更新或删除操作时,Entity Framework 需要知道跟踪对象的密钥。

无论如何,没有 PrimaryKey 的表不是一个好主意

于 2013-03-13T09:27:20.180 回答
17
  1. 实体框架必须具有在对表建模的实体(POCO 类)上标识的键。
  2. 您在实体框架中定义的键不需要存在于底层数据库(例如 sql 表)中。

如果您的 SQL 表没有主键,您仍然可以在 Entity Framework 中对其进行建模,您只需为该实体定义一个键。选择实体上的一个或多个(可能是所有)列,当它们组合时,将在实体集合中唯一标识该实例。请注意,这仅对更新或删除实体很重要,因为它们需要针对该集合中的其他实体进行唯一标识以针对更改。查找/选择和添加/插入不需要这种一致性。

于 2017-02-24T15:04:30.747 回答
11

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

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

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

在上下文的代码文件中:

protected override void OnModelCreating( DbModelBuilder model_builder )
{
    base.OnModelCreating( model_builder );
    model_builder.Entity<WeirdTable>().HasKey(
        t => new { t.Id1, t.Id2 }
    );
}

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

于 2018-03-25T11:18:26.533 回答
10

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

查询类型的一些主要使用场景是:

  • 作为即席 FromSql() 查询的返回类型。
  • 映射到数据库视图。
  • 映射到没有定义主键的表。
  • 映射到模型中定义的查询。

查询类型虽然有限制。它们不能在数据库中插入、更新或删除。而且他们对导航属性的支持有限。

于 2019-01-29T13:41:28.937 回答
2

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

EF.Core 5 新功能

于 2020-05-06T12:58:00.810 回答