EF 4.1 代码优先和成员资格

Posted

技术标签:

【中文标题】EF 4.1 代码优先和成员资格【英文标题】:EF 4.1 Code First and Membership 【发布时间】:2011-11-01 04:44:32 【问题描述】:

我确实经历了建议的类似问题,并且大多数问题都非常过时,因为 EF Code First 的所有新发展。我正在寻找解决这个 EF Code First“绊脚石”的想法或方法。

是否可以在 EF Code First 项目中使用内置的 asp 会员系统?一个常见的 Code First 示例是这样的博客、帖子、评论(来自:http://msdn.microsoft.com/en-us/data/gg685467):

public class Blog

    public int Id  get; set; 
    public string Title  get; set; 
    public string BloggerName  get; set;
    public virtual ICollection<Post> Posts  get; set; 
  

public class Post

    public int Id  get; set; 
    public string Title  get; set; 
    public DateTime DateCreated  get; set; 
    public string Content  get; set; 
    public int BlogId  get; set; 
    public ICollection<Comment> Comments  get; set; 


public class Comment

    public int Id  get; set; 
    public DateTime DateCreated  get; set; 
    public string Content  get; set; 
    public int PostId  get; set; 
    public Post Post  get; set; 

这太棒了,只是无法跟踪发布评论的用户。有什么办法可以让像这样的代码优先的东西与 asp.net 成员一起使用?

首先想到的是(仅在此处使用评论):

public class UserProfile

    public Guid Id  get; set; 
    public string FirstName  get; set; 
    public string FavoriteColor  get; set; 
    //Other useless user profile stuff here
    
public class Comment

    //Comment fields same as above
    public UserProfile Owner  get; set; 

首先想到的是更改 Account 控制器中的 Register 操作,这样当用户注册时,他们的 Guid(也可能是他们的用户名)也会添加到由 EF Code First 创建的 UserProfile 表中。我想这张表将成为我的 EF Code First 表和 asp.net 成员表之间的某种桥梁。

这种方法有意义吗?有哪些优点/缺点,还有更好的选择吗?

【问题讨论】:

【参考方案1】:

将 aspnet 会员项目安装到您的数据库中。然后,您将不会在这些实体上使用 CodeFirst。但是,您可以简单地从 MembershipProvider 中读取用户是谁。如果需要,可以直接查询这些表(但会员 API 应该为您提供所需的内容) 您还可以从实体框架电动工具中运行“逆向工程”工具,为您提供直接使用的实体。

您可以在此处获取有关安装到数据库中的更多信息。 Using HttpContext.Current.Application to store simple data

一旦将表添加到数据库中,这些强大的工具可将您的表逆向工程为代码优先实体:

http://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d

【讨论】:

【参考方案2】:

是的,这是一种方法。另一个是您实际上不需要访问成员资格,您只需要用户名,当用户通过 FormsAuthentication 登录时,该用户名将填充 IPrincipal。

var username = User.Identity.Name;

HttpContext.Current.User.Identity.Name;

您可能需要的任何其他信息都可以通过 Membership API 访问。

MembershipUser user = Membership.GetUser(User.Identity.Name);

不要试图将 ASP.NET 成员资格表映射到您的数据模型中,因为这会导致默认成​​员资格提供程序出现问题。只需使用会员 API 获取您需要的任何信息。

【讨论】:

我很受诱惑,但我克服了它=) 目前可用的最好方法似乎是第二个表,我通常使用它来跟踪 aspnet 成员不跟踪的用户信息。这可能是另一个问题,但是是否有一个属性或某种方法可以将我的 POCO 中的属性标记为必需但不是自动生成的? 我认为您的意思是作为键,但不是自动生成的。必需并不意味着任何类型的自动生成。不,您不想将其设为键,充其量您可以使数据库中的字段非空,并对其应用唯一约束。您可能还需要一个身份列 (UserProfileID) 考虑到用户名可能会改变,我会考虑通过提供者 ID 链接它来代替用户名或除了用户名之外(取决于您的系统是否允许删除或停用用户) @AdamTuliper - 我从未见过在创建用户名后可以更改用户名的系统。但是,对于一个无关紧要的简单博客来说。 @MystereMan 我觉得这太难以置信了。您从未使用过 windows、live id 以及我使用的几乎所有主要站点 - SID 存储在您的帐户后面,并且名称可以随时更改。在默认的会员提供者中,ID 也存储在幕后,您可以更改名称。此外,许多系统都基于电子邮件登录名,这在几乎任何主要站点中也可以更改。支持这一点的网站无处不在。

以上是关于EF 4.1 代码优先和成员资格的主要内容,如果未能解决你的问题,请参考以下文章

EF 4.1 代码优先关系表

EF 4.1 代码优先:多对多

Windows窗体应用程序中的连接字符串EF 4.1代码优先SQL紧凑

EF 4.1,代码优先:不属于“timestamp”或“rowversion”类型的属性不支持存储生成的模式“Computed”

MVC3 EF4.1 代码优先延迟加载

我如何设计具有受保护/私有成员 DDD 样式的 EF5 代码优先实体