2014-03-04 273 views
1

我想添加一个表来定义可应用于许多模型的权限对象。 要做到这一点,我创建了一个Permission类:实体框架与多个键的多对多关系

public class Permission 
{ 
    [Key] 
    int PermissionID {get; set;} 
    string User {get; set;} 
    bool Read {get; set;} 
    bool Write {get; set;} 
} 

然后其他对象类不是可以有权限的列表:

public class ObjectModel1 
{ 
    [Key] 
    int idObject1 {get; set;} 
    ... Other properties ... 
    public virtual ICollection<Permission> Permission {get; set;} 
} 

public class ObjectModel2 
{ 
    [Key] 
    int idObject2 {get; set;} 
    ... Other properties ... 
    public virtual ICollection<Permission> Permission {get; set;} 
} 

我怎样才能obtaint多许多人许可之间一对多的关系和其他对象类没有在每个对象的权限类中定义外键?

回答

1

一个多对多的关系将有两个实体之间的外部参照表:

// because Permission has a collection to ObjectModel1 and ObjectModel1 has a collection 
// to permission, it is treated as a many to many relationship with an implicit 
// xref between the tables. The xref will contain a foreign key to each entity that is 
// also a composite primary key 
public class Permission 
{ 
    [Key] 
    int PermissionID {get; set;} 
    string User {get; set;} 
    bool Read {get; set;} 
    bool Write {get; set;} 

    public virtual ICollection<ObjectModel1> ObjectModel1s { get; set; } 
    public virtual ICollection<ObjectModel2> ObjectModel2s { get; set; } 
} 

public class ObjectModel1 
{ 
    [Key] 
    int idObject1 {get; set;} 
    ... Other properties ... 
    public virtual ICollection<Permission> Permission {get; set;} 
} 

public class ObjectModel2 
{ 
    [Key] 
    int idObject2 {get; set;} 
    ... Other properties ... 
    public virtual ICollection<Permission> Permission {get; set;} 
} 

实体框架将创建一个表是这样PermissionObjectModel1有两个外键复合主键(一个权限,一个ObjectModel1)。它将为具有相似键的ObjectModel2创建另一个表。外键在权限本身上不存在。

如果你不希望有权限的导航属性,那么我想你会需要使用流利的API:

public class MyDbContext : DbContext 
{ 
    public DbSet<Permission> Permissions { get; set; } 
    public DbSet<ObjectModel1> ObjectModel1s { get; set; } 
    public DbSet<ObjectModel2> ObjectModel2s { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<ObjectModel1>() 
      .HasMany(many => many.Permissions) 
      .WithMany() // dont want navigation property on Permission 
      .Map(xref => xref.MapLeftKey("ObjectModel1Id") 
          .MapRightKey("PermissionId") 
          .ToTable("ObjectModel1PermissionXref")); 

     modelBuilder.Entity<ObjectModel2>() 
      .HasMany(many => many.Permissions) 
      .WithMany() // dont want navigation property on Permission 
      .Map(xref => xref.MapLeftKey("ObjectModel2Id") 
          .MapRightKey("PermissionId") 
          .ToTable("ObjectModel2PermissionXref")); 
    } 
} 

类似的东西上面的代码仍然给你一个很多人许多关系,但导航属性不会在Permission上定义。