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 代码优先和成员资格的主要内容,如果未能解决你的问题,请参考以下文章
Windows窗体应用程序中的连接字符串EF 4.1代码优先SQL紧凑
EF 4.1,代码优先:不属于“timestamp”或“rowversion”类型的属性不支持存储生成的模式“Computed”