一对一和一对多可选实体框架

问题描述 投票:0回答:1

我有一个这样的模型:

public class PortStackingDetails
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public int? StackingExtendDetailsId { get; set; }

    [ForeignKey("StackingExtendDetailsId")]
    public virtual StackingExtendDetails StackingExtendDetails { get; set; }
}

public class StackingExtendDetails
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public int PortStackingDetailsId { get; set; }

    [ForeignKey("PortStackingDetailsId")]
    public virtual PortStackingDetails PortStackingDetails { get; set; }
}
  • StackingExtendDetails
    必须有一个
    PortStackingDetails
    (一对一)
  • PortStackingDetails
    可以选择一个
    StackingExtendDetails
    (一对一)
  • PortStackingDetails
    可以与许多
    StackingExtendDetails
    相关,因为
    PortStackingDetails
    可以使用
    StackingExtendDetails
  • 扩展(创建)几次

过程其实很简单。当

PortStackingDetails
创建时,它没有
StackingExtendDetailsId
。稍后当
StackingExtendDetails
创建时,会在
StackingExtendDetailsId
中更新
PortStackingDetails
。所以基本上
StackingExtendDetailsId
用于使用
StackingExtendDetails
来跟踪最新的
PortStackingDetails

在 Entity Framework 和 ASP.NET MVC 5 中使用它时出现错误。

无法确定之间关联的主要端 类型“ERP.Models.StackingExtendDetails”和 'ERP.Models.PortStackingDetails'。本期的主要目的是 关联必须使用显式配置 关系流畅的 API 或数据注释。

是否可以仅在数据注释中建立这种关系?我尝试了 chatGPT 的一些 Fluent API,但都不起作用。

如果在 SQL Server 脚本中,我想要这样的关系:

CREATE TABLE [dbo].[PortStackingDetails]
(
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [StackingExtendDetailsId] [int] NULL,

    CONSTRAINT [PK_dbo.PortStackingDetails] 
        PRIMARY KEY CLUSTERED ([Id] ASC)
)
GO

CREATE TABLE [dbo].[StackingExtendDetails]
(
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [PortStackingDetailsId] [int] NOT NULL,

    CONSTRAINT [PK_dbo.StackingExtendDetails] 
        PRIMARY KEY CLUSTERED ([Id] ASC)
) 
GO

ALTER TABLE [dbo].[PortStackingDetails] WITH CHECK 
    ADD CONSTRAINT [FK_dbo.PortStackingDetails_dbo.StackingExtendDetails_StackingExtendDetailsId] 
        FOREIGN KEY([StackingExtendDetailsId])
        REFERENCES [dbo].[StackingExtendDetails] ([Id])
GO

ALTER TABLE [dbo].[PortStackingDetails] CHECK CONSTRAINT [FK_dbo.PortStackingDetails_dbo.StackingExtendDetails_StackingExtendDetailsId]
GO

ALTER TABLE [dbo].[StackingExtendDetails] WITH CHECK 
    ADD CONSTRAINT [FK_dbo.StackingExtendDetails_dbo.PortStackingDetails_PortStackingDetailsId] 
        FOREIGN KEY([PortStackingDetailsId])
        REFERENCES [dbo].[PortStackingDetails] ([Id])
GO

ALTER TABLE [dbo].[StackingExtendDetails] CHECK CONSTRAINT [FK_dbo.StackingExtendDetails_dbo.PortStackingDetails_PortStackingDetailsId]
GO
c# entity-framework asp.net-mvc-5
1个回答
0
投票

我认为不可能在同一张桌子之间执行

one-to-one
one-to-many

您需要选择其中之一。

但是,如果您想用

PortStackingDetails
扩展
StackingExtendDetails
,那么可以使用数据注释。

public class PortStackingDetails
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public virtual StackingExtendDetails StackingExtendDetails { get; set; }
}

public class StackingExtendDetails
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public int PortStackingDetailsId { get; set; }

    [ForeignKey("PortStackingDetailsId")]
    public virtual PortStackingDetails PortStackingDetails { get; set; } = null!;
}
© www.soinside.com 2019 - 2024. All rights reserved.