如何为现有数据库表定义复合主键?



我正在研究一个Core MVC项目,该项目从预先存在的数据库读取数据(不需要写入)。不幸的是,这个数据库完全是一团糟,但我不能改变它的任何东西(即使我可以,我也不会碰它)。

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

  • 表之间没有任何外键关系,并且包含最好输入到子表中的数据;不管是谁创建了这个数据库,他似乎都把表格当成了Excel电子表格来使用。
  • 没有定义主键或外键。
  • 表和列的名称似乎是所包含数据的首字母缩写(举个假想的例子,通常被命名为"Customer"的表将被命名为"dbbc",代表"Database - Business Customer")。
  • 表不是dbo模式。

尽管如此,我还是被迫从这个数据库中读取数据,并且更愿意使用实体框架来读取数据。

数据库托管在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:实体类型MyProject.Models。Order'要求定义主键

还有什么我可以添加使这个表与实体框架工作?

EDIT:我发现如果我在上下文的OnModelCreating方法(如modelBuilder.Entity<Order>().HasKey(ord => new { ord.OrderNo, ord.OrderLineNo });)中定义它,它就可以工作。但是,如果可能的话,我仍然更喜欢单独使用属性。

您的配置在EF6下可以正常工作。但是在EF Core中使用数据注释时,你必须小心(看起来Fluent API将是首选的方法)。

文档的Keys(primary)部分明确地声明:

您还可以使用Fluent API配置多个属性作为实体的键(称为组合键)。组合键只能使用Fluent API来配置——约定永远不会设置组合键,你也不能使用数据注释来配置组合键。

所以你真的需要使用:

modelBuilder.Entity<Order>().HasKey(e => new { e.OrderNo, e.OrderLineNo });

相关内容

  • 没有找到相关文章

最新更新