2011-01-23 53 views
19

我有基於EF Code First的模型,我希望將它們與默認的MembershipProvider一起使用,但我不知道如何正確編寫模型,所以當有數據時,它不會清除所有重新創建表的數據對模型所做的更改。如何使用EF Code First的會員供應商?

+0

請展開:您是否嘗試通過代碼首先自己創建成員資格數據庫,而不是使用.NET安裝的SQL腳本? – Richard 2011-01-23 16:16:50

+0

Db是使用aspnet_regsql生成的,但我不知道如何使用EF Code First功能加入它,就像我創建模型/類時一樣,EF生成表格。現在它將清除由aspnet_regsql創建的所有表。 – Santas 2011-01-23 16:23:57

回答

2

當前(EF 4.1 CTP)EF Code First沒有該選項。如果您對模型進行了更改,它總是會刪除一個表格。

更新:

EF 4.1 RTM允許您創建一個自定義數據庫初始化,並指定數據庫對象和數據播種的創建。

9

看一看這個項目

http://codefirstmembership.codeplex.com/

它擁有用戶和角色的實體類,以及作爲角色提供者和成員實施者。如果在datacontext類中包含用戶和角色,則將在數據庫中創建表。

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 database migration in scott gu's blog

現在來點如何第一次使用asp.net成員提供與EF代碼。有幾個挑戰:

  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); 
        }   
        } 
    
    } 
    

    現在更新的信息,你可以寫一些函數模型本身,但是我建議建立一個UserRepository與倉庫的設計模式處理用戶CRUD操作。

  2. 第二個挑戰是如何在第一次運行時創建數據庫。當播種成爲一個問題時,如果你想播種用戶信息,那麼單獨運行aspnet_regsql效率不高,因爲在播種發生之前預期會員模式。我碰到這個好文章,有一些微調它的工作對我來說:

asp.net membership and EF

0

在我DbContext.cs文件我有一個種子功能,我叫ApplicationServices.InstallServices()安裝ASP.NET我的數據庫成員資格。現在,每當我的初始化器刪除數據庫時,它都會重新創建ASP.NET成員資格模式。

public class PanelInitializer : DropCreateDatabaseAlways<PanelContext> 
{ 
    protected override void Seed(PanelContext context) 
    { 
     //Install ASP.NET Membership 
     ApplicationServices.InstallServices(SqlFeatures.Membership | SqlFeatures.RoleManager); 

     new List<Panel> 
      { 

的ApplicationServices類

using System.Configuration; 
using System.Data.SqlClient; 
using System.Web.Management; 

namespace Lansw.Panels.DataAccess.Contexts 
{ 
    public class ApplicationServices 
    { 
     readonly static string DefaultConnectionString = ConfigurationManager.AppSettings["DefaultConnectionString"]; 
     readonly static string ConnectionString = ConfigurationManager.ConnectionStrings[DefaultConnectionString].ConnectionString; 
     readonly static SqlConnectionStringBuilder MyBuilder = new SqlConnectionStringBuilder(ConnectionString); 

     public static void InstallServices(SqlFeatures sqlFeatures) 
     { 
      SqlServices.Install(MyBuilder.InitialCatalog, sqlFeatures, ConnectionString); 
     } 

     public static void UninstallServices(SqlFeatures sqlFeatures) 
     { 
      SqlServices.Uninstall(MyBuilder.InitialCatalog, sqlFeatures, ConnectionString); 
     } 
    } 
} 

感謝@ImarSpaanjaarshttp://imar.spaanjaars.com/563/using-entity-framework-code-first-and-aspnet-membership-together