1

MVC4 首先使用 db 和 simplemembership

我的会员资格工作到可以保存新用户的程度。注册此人后,我需要渲染一个新视图,以便他们填写更多信息,因此我需要将 UserProfile 表中新创建的用户 ID 传递给新视图。我尝试将模板化的注册方法修改为:

            try
            {
                WebSecurity.CreateUserAndAccount(model.UserName, model.Password, new { Email = model.Email }, true);
                WebSecurity.Login(model.UserName, model.Password);

//Get the userid for this new user
                var db = new UsersContext();
                int id = db.UserProfiles.Where(x => x.UserName == model.UserName).Select(x => x.UserId).FirstOrDefault();

                return RedirectToAction("Edit", "Profile", id);
            }

这给了我这个错误:

\tSystem.Data.Entity.Edm.EdmEntityType: : EntityType 'UserProfile' 没有定义键。定义此 EntityType 的键。\tSystem.Data.Entity.Edm.EdmEntitySet: EntityType: EntitySet 'UserProfiles' 基于没有定义键的类型'UserProfile'。

我相信此错误与尝试在不在 edmx 模型中的表上使用 EF 有关。我没有将任何简单成员表(UserProfile、Membership、Roles 等)添加到我的 edmx 文件中,因为当我这样做时,我得到了重复类的错误,我猜是因为 SM 表是首先创建代码的。

我从来没有先写过任何代码,答案就在那里吗?或者我是否需要将 SM 表添加到我的 edmx 模型中以便查询它们。如果是这样,我该如何解决重复类错误?

我的网络配置中有 2 个单独的连接字符串。

编辑++++++++++

我一直在研究并找到了不同的方法,但我得到了同样的错误。

                int id;
                using (var db = new UsersContext())
                {
                    var user = db.UserProfiles.Find(model.UserName);
                    id = user.UserId;
                }

我在“使用”行收到错误。这是 UsersContext 的代码:

public class UsersContext : DbContext
{
    public UsersContext()
        : base("SecurityEntities")
    {
    }

    public DbSet<UserProfile> UserProfiles { get; set; }
}

“SecurityEntities 是连接字符串,如下所示:

   <add name="SecurityEntities" connectionString="data source=(localdb)\v11.0;initial catalog=OurAgreements;user id=oaadmin;password=136VDSyPLrcfgPfw3BIH;multipleactiveresultsets=True;application name=EntityFramework" providerName="System.Data.SqlClient" />

你能看出我哪里错了吗?

4

2 回答 2

1

您对UserProfile的定义是什么样的。它应该看起来像这样:

[Table("UserProfile")]
public class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string UserName { get; set; }
    ...
 }

Key属性表示UserId是键,DatabaseGeneratedAttribute表示UserId是由数据库生成的。您收到的错误似乎表明您的UserProfile定义中没有Key属性。

2013 年 5 月 29 日更新

如果您在更改 UserProfile 的架构时遇到问题并且未设置迁移,请查看这篇文章,该文章展示了如何自定义和播种 SimpleMembership。本文中的设置更适合开发和测试您的应用程序。还有一篇关于为 SimpleMembership 设置数据库迁移的文章。

于 2013-05-28T13:58:03.743 回答
0

我试过了

WebSecurity.CreateUserAndAccount(model.UserName, model.Password, null, false);
var ID = WebSecurity.GetUserId(model.UserName);

它对我很有效

于 2013-08-24T10:10:18.637 回答