EF码优先多对多附加数据 [英] EF code-first many-to-many with additional data

查看:82
本文介绍了EF码优先多对多附加数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这些表:

  CREATE TABLE [EDR_SECURITY]。[Person](
[ixPerson] [ bigint] IDENTITY(1,1)NOT NULL,
[sName] [nvarchar](200)NOT NULL,
)ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]



CREATE TABLE [EDR_SECURITY]。[SecurityGroup](
[ixSecurityGroup] [bigint] IDENTITY(1,1)NOT NULL,
[sName] [nvarchar](200)NOT NULL ,
[sDescription] [nvarchar](400)NULL,
)ON [PRIMARY]


CREATE TABLE [EDR_SECURITY]。[PersonSecurityGroupDefinition](
[ixPerson] [bigint] NOT NULL,
[ixSecurityGroup] [bigint] NOT NULL,
[fPrivilege] [bigint] NOT NULL,
CONSTRAINT [PK_PersonSecurityGroupDefinition] PRIMARY KEY CLUSTERED

[ixPerson] ASC,
[ixSecurityGroup] ASC
)WITH(PAD_INDEX = OFF,STATISTICS_NORECOMPUTE = OFF,IGNORE_DUP_KEY = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON)ON [PRIMARY]
)ON [PRIMARY]

如何在EF代码中创建 - 首先关系 Person 安全组



谢谢。

解决方案

如果我从原始SQL ...

编辑:根据您的具体情况建议,我认为这至少非常接近...

  public class Person 
{
public int PersonID {get;组; }
public string Name {get;组; }
public virtual ICollection< PersonSecurityGroupDefinition>
PersonSecurityGroups {get;组; }
}
public class SecurityGroup
{
public int SecurityGroupID {get;组; }
public string Name {get;组; }
public string描述{get;组; }
public virtual ICollection< PersonSecurityGroupDefinition>
PersonSecurityGroups {get;组; }
}
public class PersonSecurityGroupDefinition
{
public int PersonID {get;组; }
public int SecurityGroupID {get;组; }
public int Privilege {get;组; }
//不要在这里使用虚拟机,因为这些是PK-s
public Person Person {get;组; }
public SecurityGroup SecurityGroup {get;组; }
}

...和 OnModelCreating (覆盖在你的 DbContext ...

  modelBuilder.Entity< PersonSecurityGroupDefinition>()
.HasKey(i => new {i.PersonID,i.SecurityGroupID});

modelBuilder.Entity< PersonSecurityGroupDefinition>()
.HasRequired(i => i.Person)
.WithMany(u => u.PersonSecurityGroups)
.HasForeignKey(i => i.PersonID)
.WillCascadeOnDelete(false );

modelBuilder.Entity< PersonSecurityGroupDefinition>()
.HasRequired(i =&i; i.SecurityGroup)
.WithMany(d => d.PersonSecurityGroups)
.HasForeignKey(i => i.SecurityGroupID)
.WillCascadeOnDelete(false);

...希望这是它。


I have these tables:

CREATE TABLE [EDR_SECURITY].[Person](
    [ixPerson] [bigint] IDENTITY(1,1) NOT NULL,
    [sName] [nvarchar](200) NOT NULL,
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]



CREATE TABLE [EDR_SECURITY].[SecurityGroup](
    [ixSecurityGroup] [bigint] IDENTITY(1,1) NOT NULL,
    [sName] [nvarchar](200) NOT NULL,
    [sDescription] [nvarchar](400) NULL,
) ON [PRIMARY]


CREATE TABLE [EDR_SECURITY].[PersonSecurityGroupDefinition](
    [ixPerson] [bigint] NOT NULL,
    [ixSecurityGroup] [bigint] NOT NULL,
    [fPrivilege] [bigint] NOT NULL,
 CONSTRAINT [PK_PersonSecurityGroupDefinition] PRIMARY KEY CLUSTERED 
(
    [ixPerson] ASC,
    [ixSecurityGroup] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

How do I create in EF code-first the relationships between Person and Security Group?

Thanks.

解决方案

If I understood exactly from the raw SQL...

EDIT: and as suggested in your specific case I think this is pretty close at least...

public class Person
{
    public int PersonID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<PersonSecurityGroupDefinition> 
        PersonSecurityGroups { get; set; }
}
public class SecurityGroup
{
    public int SecurityGroupID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public virtual ICollection<PersonSecurityGroupDefinition> 
        PersonSecurityGroups { get; set; }
}
public class PersonSecurityGroupDefinition
{
    public int PersonID { get; set; }
    public int SecurityGroupID { get; set; }
    public int Privilege { get; set; }
    // don't use virtual here as these are PK-s
    public Person Person { get; set; }
    public SecurityGroup SecurityGroup { get; set; }
}

...and in the OnModelCreating (override in your DbContext...

modelBuilder.Entity<PersonSecurityGroupDefinition>()
    .HasKey(i => new { i.PersonID, i.SecurityGroupID });

modelBuilder.Entity<PersonSecurityGroupDefinition>()
    .HasRequired(i => i.Person)
    .WithMany(u => u.PersonSecurityGroups)
    .HasForeignKey(i => i.PersonID)
    .WillCascadeOnDelete(false);

modelBuilder.Entity<PersonSecurityGroupDefinition>()
    .HasRequired(i => i.SecurityGroup)
    .WithMany(d => d.PersonSecurityGroups)
    .HasForeignKey(i => i.SecurityGroupID)
    .WillCascadeOnDelete(false);

...hope this is it.

这篇关于EF码优先多对多附加数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆