我有一个这样的模型:
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
我认为不可能在同一张桌子之间执行
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!;
}