EF Code Firstに基づくモデルがあり、デフォルトのMembershipProviderで使用したいのですが、モデルを正しく記述する方法がわからないため、変更が加えられたときにテーブルを再作成するときにすべてのデータが消去されません。モデルに。
6 に答える
このプロジェクトを見てください
http://codefirstmembership.codeplex.com/
ユーザーとロールのエンティティクラス、およびロールプロバイダーとメンバーシッププロバイダーの実装があります。データコンテキストクラスにユーザーとロールを含めると、データベースにテーブルが作成されます。
あなたの質問は2つの部分に分かれています。
- 最初にEFコードでasp.netメンバーシップAPIを使用するにはどうすればよいですか?
- モデルが変更されたときに既存のデータを保持するにはどうすればよいですか?
モデルが変更されたときに既存のデータを保持する方法については、EF 4.0 / asp.net mvc 3に関しては、データベースの移行はまだサポートされていません。データベースの移行がサポートされているか、同様の代替手段を使用しているasp.net mvc 4.0 / EF 4.3に移行する必要がありますが、それでもベータリリースです。
scottguのブログでのasp.netmvc4.0データベースの移行
ここで、最初にEFコードでasp.netメンバーシッププロバイダーを使用する方法について説明します。いくつかの課題があります:
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); } } }
情報を更新するために、モデル自体にいくつかの関数を記述できますが、ユーザーのCRUD操作を処理するためのリポジトリデザインパターンを使用してUserRepositoryを作成することをお勧めします。
2番目の課題は、最初の実行時にデータベースを作成する方法です。シードが問題になるため、ユーザー情報をシードする場合は、シードが発生する前にメンバーシップスキーマが予期されるため、aspnet_regsqlを個別に実行することは効率的ではありません。私はこの素晴らしい記事に出くわしました、それが私のために働いたいくつかの微調整で:
現在(EF 4.1 CTP)EFCodeFirstにはそのオプションがありません。モデルに変更を加えた場合は、常にテーブルが削除されます。
アップデート:
EF 4.1 RTMを使用すると、カスタムデータベース初期化子を作成し、dbオブジェクトの作成とデータシードを指定できます。
SQL Serverを使用している場合は、次のことを確認してください。
http://www.paragm.com/ef-v4-1-code-first-and-asp-net-membership-service/
基本的に、キータイプ、コンテキストオブジェクトの場所、ユーザー/ロールエンティティの場所など、ほとんどすべてを構成する方法を定義できるライブラリもあります。抽象基本クラスまたはインターフェースを使用して拡張可能。また、リポジトリパターン/作業単位/IoCコンテナを使用してすぐに使用できます。
ApplicationServices.InstallServices()
DbContext.csファイルには、データベースにASP.NETメンバーシップをインストールするためにを呼び出すSeed関数があります。これで、イニシャライザがデータベースを削除するたびに、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に感謝します。