.net EF Core无法识别复合密钥
我在尝试启动.net core应用程序时遇到此主键错误。我与另一个工作正常的实体具有完全相同的复合密钥结构。这个我缺了什么 例外情况: System.InvalidOperationException:'实体类型'DispatchOrders'需要定义主键。如果要使用无键实体类型,请调用“HasNoKey()” 主类(两者都以Id作为键) 复合密钥类.net EF Core无法识别复合密钥,.net,asp.net-core,.net-core,entity-framework-core,.net,Asp.net Core,.net Core,Entity Framework Core,我在尝试启动.net core应用程序时遇到此主键错误。我与另一个工作正常的实体具有完全相同的复合密钥结构。这个我缺了什么 例外情况: System.InvalidOperationException:'实体类型'DispatchOrders'需要定义主键。如果要使用无键实体类型,请调用“HasNoKey()” 主类(两者都以Id作为键) 复合密钥类 public class DispatchOrders { [ForeignKey("D
public class DispatchOrders
{
[ForeignKey("DispatchId")]
public int DispatchId { get; set; }
public virtual Dispatch Dispatch { get; set; }
[ForeignKey("OrderId")]
public int OrderId { get; set; }
public virtual Order Order { get; set; }
}
组合键类fluent
public DispatchOrdersMap(EntityTypeBuilder<DispatchOrders> entityBuilder)
{
entityBuilder.HasKey(o => new
{
o.DispatchId,
o.OrderId
});
entityBuilder
.HasOne(e => e.Dispatch)
.WithOne()
.HasForeignKey<Dispatch>(e => e.Id);
entityBuilder
.HasOne(e => e.Order)
.WithOne()
.HasForeignKey<Order>(e => e.Id);
}
无键实体类型支持许多与常规实体类型相同的映射功能,如继承映射和导航属性
看起来您正在尝试映射多个联接表。.NET5中的映射结构正在更改。您使用的是哪个版本的EF?如果您使用的是3.x,请尝试从子表的方向映射,而不是从联接表的方向映射。此外,当遇到无法理解的映射时,我建议尝试在测试项目上构建数据库,并查看如何构建数据库,以便表学习,然后根据需要更新代码。似乎您希望创建多对多关系。您只需要配置它们的复合密钥。如果名称匹配,efcore将自动生成外键,因此您可以删除一对多关系的配置,efcore将自动配置它。我验证了这种方法的可行性。
public DispatchOrdersMap(EntityTypeBuilder<DispatchOrders> entityBuilder)
{
entityBuilder.HasKey(o => new
{
o.DispatchId,
o.OrderId
});
entityBuilder
.HasOne(e => e.Dispatch)
.WithOne()
.HasForeignKey<Dispatch>(e => e.Id);
entityBuilder
.HasOne(e => e.Order)
.WithOne()
.HasForeignKey<Order>(e => e.Id);
}
CREATE TABLE [dbo].[DispatchOrders](
[DispatchId] [int] NOT NULL,
[OrderId] [int] NOT NULL,
CONSTRAINT [PK_DispatchOrder] PRIMARY KEY CLUSTERED
(
[DispatchId] ASC,
[OrderId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[DispatchOrders] WITH CHECK ADD FOREIGN KEY([DispatchId])
REFERENCES [dbo].[Dispatch] ([Id])
GO
ALTER TABLE [dbo].[DispatchOrders] WITH CHECK ADD FOREIGN KEY([OrderId])
REFERENCES [dbo].[Order] ([Id])
GO
[Keyless]