如何使用EF Code First的会员提供商?

San*_*tas 19 asp.net asp.net-mvc entity-framework-4 ef-code-first

我有基于EF Code First的模型,我想将它们与默认的MembershipProvider一起使用,但我不知道如何正确编写模型,所以当有更改时,它不会删除重新创建表的所有数据到模型.

wog*_*les 9

看看这个项目

http://codefirstmembership.codeplex.com/

它具有用户和角色的实体类,以及roleprovider和membershipprovider实现.如果在datacontext类中包含用户和角色,则将在数据库中创建表.


ama*_*jee 7

你的问题有两个部分.

  1. 如何首先使用EF代码使用asp.net会员API?
  2. 模型更改时如何保留现有数据?

至于如何在模型更改时保留现有数据,就EF 4.0/asp.net mvc 3而言,尚不支持数据库迁移.您将不得不转移到支持数据库迁移的asp.net mvc 4.0/EF 4.3或使用类似的替代方案,但它仍然是beta版本.

asp.net mvc 4.0数据库迁移在scott gu的博客中

现在谈谈如何首先使用带有EF代码的asp.net成员资格提供程序.有几个挑战:

  1. 我们不能/不应该使用asp.net成员资格提供者表进行连接.它不推荐,所以我的建议是为asp.net成员资格提供程序类创建一个"适配器类".例如:

     public class UserAdapter
     {
     // all user related attributes. Not stored in membership schema, but your schema
    
       public string UserProxyName;
    
       // some attributes stored in membership schema
       [NotMapped]
       public string Email { 
            get
            {
                  Membership.GetUser(UserProxyName).Email; 
            }                
       }        
    
      // some attributes stored in membership schema and not in your schema
      [NotMapped]
      public string[] UserRoles
      {
        get
        {
            return Roles.GetRolesForUser(UserProxyName);
        }           
      }
    
    }
    
    Run Code Online (Sandbox Code Playgroud)

    现在更新信息,您可以在Model本身中编写一些函数,但是我建议创建一个具有存储库设计模式UserRepository来处理用户CRUD操作.

  2. 第二个挑战是如何在首次运行时创建数据库.播种成为一个问题,如果你想播种用户信息,那么单独运行aspnet_regsql效率不高,因为在播种发生之前预期会员模式.我偶然发现了这篇很好的文章,并对它进行了一些微调:

asp.net会员资格和EF


fre*_*nky 2

目前 (EF 4.1 CTP) EF Code First 没有该选项。如果您对模型进行了更改,它总是会删除一个表。

更新:

EF 4.1 RTM 允许您创建自定义数据库初始值设定项并指定数据库对象的创建和数据播种。