我正在为Silverlight应用程序创建一个实体模型,该模型目前处于不断变化的状态。我的一般工作流程是根据需要添加和删除位,然后在我工作时从实体模型生成数据库。
我正在尝试将ASP.NET用户/成员资格表合并到实体模型中,但我遇到了一些恼人的问题。我试图将我自己的表Courses与aspnet_Users表关联成多对多关系。这根本不需要修改aspnet_Users表,只需要修改Courses上的外键。但是,当我尝试从模型构建数据库时,我从EF中获取错误,因为它试图删除aspnet_Users并重新创建它,因为来自其他aspnet_ *表的外键关系而失败。
我是以错误的方式解决这个问题吗?我是否应该使用某种成员资格提供者模型来挂钩ASP.NET成员资格/角色等?有什么方法可以做我需要做的事情,但仍然利用ASP.NET团队所做的所有工作,并节省了创建我自己的角色/成员资格/个人资料系统的麻烦?
答案 0 :(得分:1)
(我在这里,因为我正在阅读关于SO的帖子,因为没有人回答我的问题而感到沮丧,而且我认为我会把我的2c价值放在这个还在等待答案的人身上。 。)
在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; }
}
}
}
构建于ASP.NET运行时中System.Web.Profile公开的“ProfileBase”类。
我还为自己建立了一些助手,类似于以下内容:
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;
}
另一种方式(虽然我猜你可以在任何其他myrid的东西上使用automapper,stucturemap,为了我的目的,上面和它的堂兄弟已经足够我正在做的小项目,让我得到从我的观点模型来回来回的东西。
在你的情况下,你最喜欢将这个类和配置信息放在某种服务API之后,然后将服务器Json对象服务到你的silverlight应用程序。
然而,关于所有这些的聪明部分是它不需要更改数据库模式。角色和成员资格系统已经有了用于保存序列化/反序列化数据的列,因此您可以随时在类和web.config文件中添加/删除条目,系统将按原样使用它们,任何删除的我都可以拉回一次,但永远不会再次保存,新的可能在第一次使用时不存在,但会在您第一次保存对象时保存。
然而,通过一些创造性的错误处理,可以相对容易地处理这两个边缘情况。
我知道它与单独的表格不同,但这是一个很好的解决方案,它也适用于旧版本的EF。
如果您使用的是EF5 +,那么您应该查看实体迁移内容,直截了当地说它只是摇滚。设置完成后,数据库更新在包管理器控制台窗口中只是一些简单的新命令。
我知道这已经太晚了2年,但希望它有些模糊不清。
辣妹