(Я здесь, потому что я читал посты о том, как я спускаюсь по сковородке после того, как разочаровался, когда никто не отвечал на мой, и я решил, что положу свой 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