我正在研究一个从预先存在的数据库读取数据(无需写入)的 Core MVC 项目。不幸的是,这个数据库一团糟,但我无法更改其中的任何内容(即使可以,我也不会用 10 英尺长的杆子碰它)。
数据库的一些相关问题如下:
尽管如此,我还是被迫从这个数据库中读取数据,并且更愿意使用 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; }
}
尽管如此,尝试运行该项目会产生一个错误:
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/