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

Pra*_*eek 31 c# entity-framework

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

sir*_*adk 43

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

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

这没有什么不对,并且不应该说没有PK的桌子是个坏主意.

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

最重要的是,EF不支持没有开箱即用的表格,有一些奇怪的解决方法,但我所看到的都不够好.这是一种耻辱.

  • 究竟.我们有一个包含一条记录的设置表.真的不需要PK. (7认同)
  • 我有一个不是由另一家公司制作的程序,因此我无法更改,但它有一个没有主键的表,它包含订单行。通过使用两列例如 articleID(或可能是行号)和 orderID 组合来更新或删除单个行,添加新行没有问题。这是它似乎被使用的一种方式。不是说这是一个好主意还是坏主意,只是一个现实生活中的例子,如果我想与 EF 连接到同一个数据库,我必须处理一些事情。 (2认同)

Wah*_*tar 21

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

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

  • 好吧wahid,你是对的,没有PK的表,无法执行更新或删除等一般操作,但是如果我可以告诉EF使用唯一但不是PK的特定列,那么在这种情况下,这个操作(更新,删除)可以由EF执行吗? (3认同)

Sea*_*n B 12

  1. 实体框架必须在对表进行建模的实体(POCO类)上标识密钥.
  2. 您在实体框架中定义的关键不NOT需要存在于底层的数据库(如SQL表).

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

  • 但这根本不允许我添加表格 (2认同)

Jps*_*psy 8

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

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

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

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


Sla*_*nko 7

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

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

    [Column( "ID2" )]
    public int Id2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在上下文的代码文件中:

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

因此,基本上,您只需要指定哪些列可以为主键。