sql-server - 我应该如何为现有数据库表定义复合主键?

标签 sql-server entity-framework entity-framework-core composite-primary-key ef-database-first

我正在研究一个从预先存在的数据库读取数据(无需写入)的 Core MVC 项目。不幸的是,这个数据库一团糟,但我无法更改其中的任何内容(即使可以,我也不会用 10 英尺长的杆子碰它)。

数据库的一些相关问题如下:

  • 这些表之间没有任何外键关系,并且包含最好输入到子表中的数据;创建数据库的人似乎使用了表格,就好像它们是 Excel 电子表格一样。
  • 没有定义主键或外键。
  • 表和列的名称似乎是所包含数据的首字母(对于一个虚构的示例,通常将其命名为“Customer”的表将被命名为“dbbc”以表示“Database - Business Customer”)。
  • 这些表不在“dbo”模式中。

  • 尽管如此,我还是被迫从这个数据库中读取数据,并且更愿意使用 Entity Framework 来这样做。

    数据库托管在 SQL Server 2008R2 .

    通过使用 [Table]、[Column] 和 [Key] 等属性来使用具有映射到实际列名的正确属性名称的类,我可以使它在我必须使用的表之一上正常工作。然而,另一个表被证明是一个问题。

    该表没有可以被视为主键的单列,但我发现两列的组合 每一行都是唯一的,因此它们可以被视为复合主键(即使它们在数据库中没有这样定义)。

    我已经定义了一个如下所示的类(我已经更改了名称以隐藏此数据库的身份,就像我想命名和羞辱一样):
    [Table("dbbo", Schema = "schema")]
    public class Order
    {
        [Key]
        [Column("order", Order = 0)]
        public string OrderNo { get; set; }
    
        [Key]
        [Column("order_line", Order = 1)]
        public string OrderLineNo { get; set; }
    
        [Column("qty")]
        public double Quantity { get; set; }
    
        [Column("pr")]
        public double Price { get; set; }
    }
    
  • 我已将 [Key] 属性添加到构成假想复合主键的两列。
  • 当我读到复合键需要它时,我已经向 [Column] 属性的 Order 属性添加了一个值。
  • 我只映射了我需要使用的列,因为该表的列比与该项目相关的列多大约 10 倍。

  • 尽管如此,尝试运行该项目会产生一个错误:

    InvalidOperationException: The entity type 'MyProject.Models.Order' requires a primary key to be defined.



    我还可以添加任何内容以使该表与 Entity Framework 一起使用吗?

    编辑:如果我在上下文的 OnModelCreating 中定义它,我发现它有效方法,如 modelBuilder.Entity<Order>().HasKey(ord => new { ord.OrderNo, ord.OrderLineNo }); .但是,如果可能的话,我仍然更愿意单独使用属性。

    最佳答案

    您的配置适用于 EF6。但是在 EF Core 中使用数据注释时必须小心(看起来 Fluent API 将是那里的首选方法)。

    Keys(primary)文档的部分明确指出:

    You can also use the Fluent API to configure multiple properties to be the key of an entity (known as a composite key). Composite keys can only be configured using the Fluent API - conventions will never setup a composite key and you can not use Data Annotations to configure one.



    所以你真的需要使用:
    modelBuilder.Entity<Order>().HasKey(e => new { e.OrderNo, e.OrderLineNo });
    

    关于sql-server - 我应该如何为现有数据库表定义复合主键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39829626/

    相关文章:

    entity-framework - 如何将属性映射与 EF Core DB First 一起使用

    java - 使用 xp_cmdshell 时无法访问 jarfile

    sql - 如何将字段内的值总和分配给变量?

    c# - 中等信任度的 MySql 数据实体 EF6

    entity-framework - 有什么方法可以检测 EntityFramework Core 是否在工具内运行?

    c# - EFCore Linq ThenInclude 两个外键到同一个表

    .net-core - EF Core 在迁移过程中锁定数据库

    java - 如何使用程序值在 SQL SERVER 中搜索

    sql - 删除 SQL Server 中的临时表?

    c# - 从 Entity Framework 中的集合加载相关实体