Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net EF Core无法识别复合密钥_.net_Asp.net Core_.net Core_Entity Framework Core - Fatal编程技术网

.net EF Core无法识别复合密钥

.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

我在尝试启动.net core应用程序时遇到此主键错误。我与另一个工作正常的实体具有完全相同的复合密钥结构。这个我缺了什么

例外情况: System.InvalidOperationException:'实体类型'DispatchOrders'需要定义主键。如果要使用无键实体类型,请调用“HasNoKey()”

主类(两者都以Id作为键)

复合密钥类

    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]