如何使用Entity-framework与同一个类进行多对多关系

时间:2016-11-29 19:33:07

标签: entity-framework asp.net-mvc-4 many-to-many

我想与.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

1 个答案:

答案 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);