Как использовать членство провайдера с EF Code First? - PullRequest
19 голосов
/ 23 января 2011

У меня есть модели, основанные на EF Code First, и я хочу использовать их со стандартным MembershipProvider, но я не знаю, как правильно написать модель, поэтому она не сотрет все мои данные при воссоздании таблиц, когда были внесены изменения в модель.

Ответы [ 6 ]

9 голосов
/ 15 мая 2011

Посмотрите на этот проект

http://codefirstmembership.codeplex.com/

Он имеет классы сущностей для пользователей и ролей, а также реализацию roleprovider и membershipprovider.Если вы включите пользователей и роли в ваш класс datacontext, таблицы будут созданы в вашей базе данных.

7 голосов
/ 06 мая 2012

Ваш вопрос состоит из двух частей.

  1. Как сначала использовать API членства asp.net с кодом EF?
  2. Как сохранить существующие данные при изменении модели?

как Как сохранить существующие данные при изменении модели, насколько это возможно в EF 4.0 / asp.net mvc 3, миграции баз данныхпока не поддерживаются.Вам нужно будет перейти на asp.net mvc 4.0 / EF 4.3, где поддерживается миграция базы данных, или использовать аналогичные альтернативы, но она все еще находится в стадии бета-версии.

Теперь перейдем к вопросу о том, как сначала использовать поставщика членства 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 и EF

2 голосов
/ 23 января 2011

В настоящее время (EF 4.1 CTP) EF Code First не имеет этой опции.Он всегда удаляет таблицу, если вы внесли изменения в модель.

Обновление:

EF 4.1 RTM позволяет вам создать собственный инициализатор базы данных и указать создание объектов db изаполнение данных.

1 голос
/ 28 марта 2012

Существует также моя библиотека, которая в основном позволяет вам определить, как почти все должно быть сконфигурировано, включая: тип ключа, где находится ваш контекстный объект и где находятся ваши объекты пользователя / роли.Расширяемый с использованием абстрактных базовых классов или интерфейсов.Также достаточно хорошо работает из коробки с шаблоном хранилища / единицей работы / контейнерами IoC.

Источник: https://github.com/holyprin/holyprin.web.security

NuGet: https://nuget.org/packages/Holyprin.Web.Security

1 голос
/ 05 апреля 2011

Если вы используете SQL Server, проверьте это:

http://www.paragm.com/ef-v4-1-code-first-and-asp-net-membership-service/

0 голосов
/ 31 июля 2012

В моем файле DbContext.cs у меня есть функция Seed, где я вызываю 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);
        }
    }
}

Благодаря @ ImarSpaanjaars http://imar.spaanjaars.com/563/using-entity-framework-code-first-and-aspnet-membership-together.

...