EF CTP5 - 静态表 [英] EF CTP5 - Static Tables

查看:50
本文介绍了EF CTP5 - 静态表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个场景,我有一个User类和一个Role类。 1个用户可以拥有1个或多个角色。角色应该是预定义的,因为我有5个角色,而不是更多。我的流畅api方法对于新用户来说会是什么?我目前的方法是创建
5角色类,这些角色类是从基类Role类(Table-Per-Hiararchy)继承的。但这创造了一个鉴别领域。感觉脏了我。我的目标是为CTP5生成一个User表,然后是一个UserRole表,其中包含用户和角色ID,然后是一个静态Roles表
,它只有5个静态角色。

I have a scenario where I have a User class and a Role class. 1 user can have 1 or more roles. The roles should be predefined as I have 5 roles and no more. What would my fluent api approach have to be upon a dding a new user? My current approach is to create 5 Role classes that subclass from a base Role class (Table-Per-Hiararchy). But that create a discriminator field. Feels dirty to me. My goal is for CTP5 generate a User table, then a UserRole table that contains user and role ids and then a static Roles table that simply has 5 static roles.

任何帮助表示赞赏。

推荐答案

gsogoly,

 

您描述的表格结构可以使用多对多关系进行映射。 
例如:

 

   
public class
用户

    public class User

   
{

    {

       
public int UserId {
获得; set ; }

        public int UserId { get; set; }

 

        
public ICollection < 角色>角色{
获取; set ; }

        public ICollection<Role> Roles { get; set; }

&NBSP;&NBSP;&NBSP;
}

    }

 

&NBSP;&NBSP;&NBSP;
public class
角色

    public class Role

   
{

    {

       
public string RoleId {
获得; set ; }

        public string RoleId { get; set; }

&NBSP;&NBSP;&NBSP;
}

    }

 

&NBSP;&NBSP;&NBSP;
public class
UsersContext DbContext

    public class UsersContext : DbContext

< span style ="font-family:Consolas; font-size:9.5pt">    
{

    {

       
public DbSet < 用户>用户{
获取; set ; }

        public DbSet<User> Users { get; set; }

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;
public DbSet < 角色>角色{
获取; set ; }

        public DbSet<Role> Roles { get; set; }

 

   &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;
受保护 覆盖
void OnModelCreating( ModelBuilder modelBuilder)

        protected override void OnModelCreating(ModelBuilder modelBuilder)

       
{

        {

           
modelBuilder.Entity< 用户>()。HasMany(u => u.Roles).WithMany();

            modelBuilder.Entity<User>().HasMany(u => u.Roles).WithMany();

  &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;
}

        }

   
}

    }

 

但是,核心EF代码不支持静态(或只读)表的概念。 
这是过去曾要求的功能,我们希望将来添加对它的支持,但它不会在Code First的第一个版本中提供。&NBSP;
如果您使用Code First生成数据库,并且希望每次Code First生成数据库时使用您的五个角色填充Role表,那么您可以使用数据库初始化程序来执行此操作。  
例如:

However, the concept of a static (or read-only) table is not supported by the core EF code.  This is a feature that has been requested in the past and we would like to add support for it in the future, but it won’t be available in the first release of Code First.  If you are using Code First to generate your database and you want to populate your Role table with your five roles every time that Code First generates the database, then you could use a database initializer to do that.  For example:

 

   
public class
UsersContextInitializer :<跨度风格=" 颜色:#2b91af ">
DropCreateDatabaseIfModelChanges <的 UsersContext >

    public class UsersContextInitializer : DropCreateDatabaseIfModelChanges<UsersContext>

  ;&NBSP;&NBSP;
{

    {

       
受保护 覆盖
void 种子( UsersContext context)

        protected override void Seed(UsersContext context)

       
{

        {

           
foreach var roleId
in new [] {
" One"
"Two"
" Three"
"四个"
"五个"
})

            foreach (var roleId in new[] { "One", "Two", "Three", "Four", "Five" })

      &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;
{

            {

               
context.Roles.Add( new
角色
{ RoleId = roleId});

                context.Roles.Add(new Role { RoleId = roleId });

< span style ="">           
}

            }

       
}

        }

   
}

    }

 

然后在应用启动中的某处设置初始值:

 

   
DbDatabase
.SetInitializer( new
UsersContextInitializer ());

    DbDatabase.SetInitializer(new UsersContextInitializer());

 

最后,如果要更改表的名称和连接表中列的名称,可以执行以下操作:

 

   
public class
用户

    public class User

   
{

    {

       
public int UserId {
获得; set ; }

        public int UserId { get; set; }

 

   &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;
public ICollection < 角色>角色{
获取; set ; }

        public ICollection<Role> Roles { get; set; }

&NBSP;&NBSP;&NBSP;
}

    }

 

&NBSP;&NBSP;&NBSP;
public class
角色

    public class Role

   
{

    {

       
public string RoleId {
获得; set ; }

        public string RoleId { get; set; }

&NBSP;&NBSP;&NBSP;
}

    }

 

&NBSP;&NBSP;&NBSP;
public class
UsersContext DbContext

    public class UsersContext : DbContext

< span style ="font-family:Consolas; font-size:9.5pt">    
{

    {

       
public DbSet < 用户>用户{
获取; set ; }

        public DbSet<User> Users { get; set; }

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;
public DbSet < 角色>角色{
获取; set ; }

        public DbSet<Role> Roles { get; set; }

 

   &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;
受保护 覆盖
void OnModelCreating( ModelBuilder modelBuilder)

        protected override void OnModelCreating(ModelBuilder modelBuilder)

       
{

        {

           
modelBuilder.Entity<的用户>()ToTable(的"使用者" );

            modelBuilder.Entity<User>().ToTable("User");

< span style ="">           
modelBuilder.Entity<的作用>()ToTable(的"作用" );

            modelBuilder.Entity<Role>().ToTable("Role");

< span style ="">           
modelBuilder.Entity< 用户>()。HasMany(u => u.Roles).WithMany()。Map( m =>

            modelBuilder.Entity<User>().HasMany(u => u.Roles).WithMany().Map(m =>

               
{

                {

     ;               
m.ToTable(" UserRole" );

                    m.ToTable("UserRole");

<跨度风格="">&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;  
m.MapLeftKey(u => u.UserId," UserId" );

                    m.MapLeftKey(u => u.UserId, "UserId");

<跨度风格="">&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ; 
m.MapRightKey(r => r.RoleId," RoleId" );

                    m.MapRightKey(r => r.RoleId, "RoleId");

               
});

                });

<跨度风格="">&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;
modelBuilder.Entity< < span style ="color:#2b91af"> User
>()。HasMany(u => u.Roles).WithMany();

            modelBuilder.Entity<User>().HasMany(u => u.Roles).WithMany();

       
}

        }

   
}

    }

 

希望这会有所帮助。

 

谢谢,

< span style ="font-family:Calibri"> Arthur


这篇关于EF CTP5 - 静态表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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