我想与.NET MVC EF创建多对多关系。我有客户模式(可能是雇主或雇员或同事等,公司或个人)。因此,任何客户都可以拥有员工或雇主。我不知道如何在EF中设置这种关系。
我的模型(数据库上下文的一部分):
public partial class Client
{
public long Id { get; set; }
public string Name { get; set; }
public virtual ICollection<ClientRelation> TargetClientRelations { get; set; }
public virtual ICollection<ClientRelation> SourceClientRelations { get; set; }
}
public enum ClientRelationType
{
Employer_Employee
}
public class ClientRelation
{
public long Id { get; set; }
public virtual Client Client { get; set; }
public virtual Client TargetClient { get; set; }
public ClientRelationType ClientRelationType { get; set; }
}
问题是EF创建了这个关系表。我猜我应该创建一些映射..
CREATE TABLE [dbo].[ClientRelations](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[Client_Id] [bigint] NULL,
[TargetClient_Id] [bigint] NULL,
[Client_Id1] [bigint] NULL,
[Client_Id2] [bigint] NULL,
[ClientRelationType] [int] NOT NULL,
CONSTRAINT [PK_dbo.ClientRelations] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[ClientRelations] ADD DEFAULT ((0)) FOR [ClientRelationType]
GO
ALTER TABLE [dbo].[ClientRelations] WITH CHECK ADD CONSTRAINT [FK_dbo.ClientRelations_dbo.Clients_Client_Id] FOREIGN KEY([Client_Id])
REFERENCES [dbo].[Clients] ([Id])
GO
ALTER TABLE [dbo].[ClientRelations] CHECK CONSTRAINT [FK_dbo.ClientRelations_dbo.Clients_Client_Id]
GO
ALTER TABLE [dbo].[ClientRelations] WITH CHECK ADD CONSTRAINT [FK_dbo.ClientRelations_dbo.Clients_Client_Id1] FOREIGN KEY([Client_Id1])
REFERENCES [dbo].[Clients] ([Id])
GO
ALTER TABLE [dbo].[ClientRelations] CHECK CONSTRAINT [FK_dbo.ClientRelations_dbo.Clients_Client_Id1]
GO
ALTER TABLE [dbo].[ClientRelations] WITH CHECK ADD CONSTRAINT [FK_dbo.ClientRelations_dbo.Clients_Client_Id2] FOREIGN KEY([Client_Id2])
REFERENCES [dbo].[Clients] ([Id])
GO
ALTER TABLE [dbo].[ClientRelations] CHECK CONSTRAINT [FK_dbo.ClientRelations_dbo.Clients_Client_Id2]
GO
ALTER TABLE [dbo].[ClientRelations] WITH CHECK ADD CONSTRAINT [FK_dbo.ClientRelations_dbo.Clients_TargetClient_Id] FOREIGN KEY([TargetClient_Id])
REFERENCES [dbo].[Clients] ([Id])
GO
ALTER TABLE [dbo].[ClientRelations] CHECK CONSTRAINT [FK_dbo.ClientRelations_dbo.Clients_TargetClient_Id]
GO
答案 0 :(得分:1)
您需要向模型添加一些其他配置,以指定与哪个属性相关。
使用数据转换,您需要使用InverseProperty
属性:
public class ClientRelation
{
public long Id { get; set; }
[InverseProperty("SourceClientRelations")]
public virtual Client Client { get; set; }
[InverseProperty("TargetClientRelations")]
public virtual Client TargetClient { get; set; }
public ClientRelationType ClientRelationType { get; set; }
}
如果您决定使用Fluent Api,那么您的配置将是:
modelBuilder.Entity<ClientRelation>()
.HasOptional(l => l.TargetClient)
.WithMany(p => p.TargetClientRelations);
modelBuilder.Entity< ClientRelation>()
.HasOptional(l => l.Client)
.WithMany(p => p.SourceClientRelations);