如何使用Entity Framework和ASP.NET成员资格表?

时间:2011-02-21 20:12:18

标签: entity-framework-4 asp.net-membership

我正在为Silverlight应用程序创建一个实体模型,该模型目前处于不断变化的状态。我的一般工作流程是根据需要添加和删除位,然后在我工作时从实体模型生成数据库。

我正在尝试将ASP.NET用户/成员资格表合并到实体模型中,但我遇到了一些恼人的问题。我试图将我自己的表Courses与aspnet_Users表关联成多对多关系。这根本不需要修改aspnet_Users表,只需要修改Courses上的外键。但是,当我尝试从模型构建数据库时,我从EF中获取错误,因为它试图删除aspnet_Users并重新创建它,因为来自其他aspnet_ *表的外键关系而失败。

我是以错误的方式解决这个问题吗?我是否应该使用某种成员资格提供者模型来挂钩ASP.NET成员资格/角色等?有什么方法可以做我需要做的事情,但仍然利用ASP.NET团队所做的所有工作,并节省了创建我自己的角色/成员资格/个人资料系统的麻烦?

1 个答案:

答案 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年,但希望它有些模糊不清。

辣妹