Как работать с Entity Framework и таблицами членства ASP.NET? - PullRequest
0 голосов
/ 21 февраля 2011

Я создаю модель сущности для приложения Silverlight, которое в настоящее время постоянно меняется.Мой общий рабочий процесс заключается в добавлении и удалении битов по мере необходимости, а затем в процессе работы генерирую БД из модели сущностей.

Я пытаюсь включить таблицы пользователей / членства ASP.NET в модель сущностей, но сталкиваюсь с некоторыми раздражающими проблемами.Я пытаюсь связать свою собственную таблицу Courses с таблицей aspnet_Users в соотношении «многие ко многим».Для этого вообще не нужно изменять таблицу aspnet_Users, просто внешний ключ на курсах.Однако, когда я пытаюсь построить БД из модели, я получаю ошибки от EF, потому что он пытается отбросить aspnet_Users и воссоздать его, что не удается из-за отношений внешнего ключа из других таблиц aspnet_ *.

Я собираюсь сделать этосовершенно неправильно?Должен ли я использовать какую-либо модель поставщика членства для подключения к членству / ролям ASP.NET и т. Д.?Есть ли какой-то способ, которым я могу сделать то, что мне нужно, но при этом использовать всю работу, которую проделала команда ASP.NET, и избавить себя от хлопот, связанных с созданием моей собственной системы ролей / членства / профиля?

1 Ответ

1 голос
/ 27 мая 2013

(Я здесь, потому что я читал посты о том, как я спускаюсь по сковородке после того, как разочаровался, когда никто не отвечал на мой, и я решил, что положу свой 2с на этот, все еще ожидая ответа .. .)

До EF V5 я решил эту проблему с помощью поставщика профилей ролей и членства.

В вашем файле web.config (который содержит соединение с базой данных с вашими данными о членстве в asp.net, вы можете определить что-то вроде следующего:

<profile enabled="true" defaultProvider="MyProfileProvider">

  <providers>
    <clear />
    <add name="MyProfileProvider"
         connectionStringName="vbox01"
         type="System.Web.Profile.SqlProfileProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  </providers>

  <properties>
    <add name="FirstName" type="System.String" />
    <add name="LastName" type="System.String" />
    <add name="BirthDay" type="System.DateTime" />
    <add name="CustomBackColour" type="System.String" />
    <add name="CustomLinkColour" type="System.String" />
    <add name="CustomLinkHoverColour" type="System.String" />
    <add name="ProfilePhoto" type="System.String" />
    <add name="Modules" type="System.Collections.Generic.List`1[System.String]" serializeAs="Binary"/>
    <add name="SideModules" type="System.Collections.Generic.List`1[System.String]" serializeAs="Binary"/>
    <add name="DefaultPageName" type="System.String" />
    <add name="DefaultModule" type="System.String" />
    <add name="PersonalPage" type="System.Boolean" />
  </properties>
</profile>

как только вы добавите это, вы можете поддерживать доступ к нему в своем веб-приложении с помощью следующего:

using System;
using System.Collections.Generic;
using System.Web.Profile;

namespace intranet.web.Classes
{
  public class ProfileCommon : ProfileBase
  {
    [SettingsAllowAnonymous(false)]
    public string FirstName
    {
      get { return base["FirstName"] as string; }
      set { base["FirstName"] = value; }
    }

    [SettingsAllowAnonymous(false)]
    public string LastName
    {
      get { return base["LastName"] as string; }
      set { base["LastName"] = value; }
    }

    [SettingsAllowAnonymous(false)]
    public DateTime BirthDay
    {
      get { return (DateTime)base["BirthDay"]; }
      set { base["BirthDay"] = value; }
    }

    [SettingsAllowAnonymous(false)]
    public string CustomBackColour
    {
      get { return base["CustomBackColour"] as string; }
      set { base["CustomBackColour"] = value; }
    }

    [SettingsAllowAnonymous(false)]
    public string CustomLinkColour
    {
      get { return base["CustomLinkColour"] as string; }
      set { base["CustomLinkColour"] = value; }
    }

    [SettingsAllowAnonymous(false)]
    public string CustomLinkHoverColour
    {
      get { return base["CustomLinkHoverColour"] as string; }
      set { base["CustomLinkHoverColour"] = value; }
    }

    [SettingsAllowAnonymous(false)]
    public string ProfilePhoto
    {
      get { return base["ProfilePhoto"] as string; }
      set { base["ProfilePhoto"] = value; }
    }

    [SettingsAllowAnonymous(false)]
    public List<string> Modules
    {
      get { return (List<string>)base["Modules"]; }
      set { base["Modules"] = value; }
    }

    [SettingsAllowAnonymous(false)]
    public List<string> SideModules
    {
      get { return (List<string>)base["SideModules"]; }
      set { base["SideModules"] = value; }
    }

    [SettingsAllowAnonymous(false)]
    public string DefaultPageName
    {
      get { return base["DefaultPageName"] as string; }
      set { base["DefaultPageName"] = value; }
    }

    [SettingsAllowAnonymous(false)]
    public string DefaultModule
    {
      get { return base["DefaultModule"] as string; }
      set { base["DefaultModule"] = value; }
    }

    [SettingsAllowAnonymous(false)]
    public bool PersonalPage
    {
      get { return (bool)base["PersonalPage"]; }
      set { base["PersonalPage"] = value; }
    }

  }
}

Который основан на классе "ProfileBase", предоставляемом System.Web.Profile во время выполнения ASP.NET.

Я также собрал себе несколько помощников, похожих на следующие:

public static MemberData GetMemberDataFor(string userName)
{
  MemberData result = new MemberData();

  MembershipUser user = Membership.GetUser(userName);
  if(user != null)
  {
    ProfileCommon pc = new ProfileCommon();
    pc.Initialize(userName, true);

    result.UserName = user.UserName;
    result.FirstName = pc.FirstName;
    result.LastName = pc.LastName;
    result.Birthday = pc.BirthDay;
    result.BackGroundColour = pc.CustomBackColour;
    result.LinkColour = pc.CustomLinkColour;
    result.HoverColour = pc.CustomLinkHoverColour;
    result.ProfilePhoto = pc.ProfilePhoto;
    result.DefaultPage = pc.DefaultPageName;
    result.HasPersonalPage = pc.PersonalPage;
    result.Modules = pc.Modules;
    result.SideModules = pc.SideModules;
    result.DefaultModule = pc.DefaultModule;
    result.DateRegistered = user.CreationDate;
    result.MemberId = (Guid?) user.ProviderUserKey;

  }
  else
  {
    result = null;
  }

  return result;
}

и один идет в другую сторону (хотя я думаю, что вы могли бы использовать automapper, stucturemap для любых других целей, для моих целей, описанных выше, и его двоюродных братьев было достаточно для небольшого проекта, над которым я работал, чтобы позволить мне получить вещи взад и вперед тоже и с моей точки зрения модели.

В вашем случае вам больше всего хотелось бы поместить этот класс и информацию о конфигурации в какой-то сервисный API, который затем отправлял бы объекты Json в ваше приложение silverlight.

Однако, умная часть всего этого заключается в том, что он не требует изменений схемы базы данных. В системе ролей и членства уже есть столбцы для хранения сериализованных / десериализованных данных, поэтому вы можете в любое время добавлять / удалять записи из классов и из файла web.config, и система будет просто использовать их как есть, любые удаленные объекты откатывается один раз, но никогда не будет сохранен, и новые могут не существовать при первом использовании, но будут сохранены при первом сохранении объекта.

Однако эти два крайних случая можно относительно легко обработать с помощью некоторой творческой обработки ошибок.

Я знаю, что это не то же самое, что иметь отдельные столы, но это хорошая работа и хорошо работает со старыми версиями EF.

Однако, если вы используете EF5 +, то вам просто нужно проверить материал миграции сущностей, прямо говоря, он просто потрясающий. После настройки обновления БД выполняются просто, как несколько новых команд в окне консоли диспетчера пакетов.

Я знаю, что уже на 2 года поздно, но, надеюсь, это поможет каким-то неясным способом.

Shawty

...