Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用MVC标识,无法在数据库中插入用户,错误为“;用户名已被占用";_C#_Asp.net_Asp.net Mvc_Asp.net Identity - Fatal编程技术网

C# 使用MVC标识,无法在数据库中插入用户,错误为“;用户名已被占用";

C# 使用MVC标识,无法在数据库中插入用户,错误为“;用户名已被占用";,c#,asp.net,asp.net-mvc,asp.net-identity,C#,Asp.net,Asp.net Mvc,Asp.net Identity,我很沮丧。我会尽量说得具体一些 在身份验证方面,我是一个不折不扣的人,尽管我从一开始就完成了整个Identity/Owin设置教程 正如我所说,我设法在一个单独的项目中完成了它,我只是为了遵循教程而创建的,而且它工作得很好 现在,当我试图将我在实际项目中学到的东西与我在教程中使用的代码完全集成时,问题就来了。这个项目的不同之处在于,我将解决方案分为三个项目,分别是BusinessLayer、DataObjects和UI。在这个解决方案中,我无法通过教程的第一部分,只是“基础”部分,在那里我应该添

我很沮丧。我会尽量说得具体一些

在身份验证方面,我是一个不折不扣的人,尽管我从一开始就完成了整个Identity/Owin设置教程

正如我所说,我设法在一个单独的项目中完成了它,我只是为了遵循教程而创建的,而且它工作得很好

现在,当我试图将我在实际项目中学到的东西与我在教程中使用的代码完全集成时,问题就来了。这个项目的不同之处在于,我将解决方案分为三个项目,分别是BusinessLayer、DataObjects和UI。在这个解决方案中,我无法通过教程的第一部分,只是“基础”部分,在那里我应该添加一个具有硬编码值的用户

这是我的。在DataObjects项目中,我有一个“IdentityModel.cs”,在这里我扩展了IdentityUser和IdentityDbContext类。看起来是这样的:

public class ApplicationUser : IdentityUser

{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int AccountTypeId { get; set; }
    public DateTime CreatedOn { get; set; }
    public string CreatedBy { get; set; }

}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext() : base("AdsTracker_DevEntities")
    {
    }
}
 public async Task<string> AddUser()

    {
        ApplicationUser user;
        ApplicationUserStore Store = new ApplicationUserStore(new ApplicationDbContext());
        ApplicationUserManager userManager = new ApplicationUserManager(Store);
        user = new ApplicationUser
        {
            FirstName = "Lilian",
            LastName = "Cobian",
            AccountTypeId = 1,
            UserName = "test.test",
            Email = "prueba@gfrmedia.com",
            CreatedOn = DateTime.Now

        };

        var result = await userManager.CreateAsync(user, "P@ssword");
        if (!result.Succeeded)
        {
            return result.Errors.First();
        }
        return "User Added";

    }
公共类应用程序用户:IdentityUser
{
公共字符串名{get;set;}
公共字符串LastName{get;set;}
public int AccountTypeId{get;set;}
public DateTime CreatedOn{get;set;}
通过{get;set;}创建的公共字符串
}
公共类ApplicationDbContext:IdentityDbContext
{
public ApplicationDbContext():base(“AdsTracker\u DevEntities”)
{
}
}
“AdsTracker\u DevEntities”是我的connectionstring的名称,它在DataObjects项目的web.config中声明。然后,在BusinessLayer项目中,我有一个名为“ProjectStart”的文件夹。在此文件夹中,我有一个带有以下代码的“IdentityConfig.cs”:

   public class ApplicationUserStore : UserStore<ApplicationUser>
{
    public ApplicationUserStore(ApplicationDbContext context) : base(context)
    {
    }
}

public class ApplicationUserManager : UserManager<ApplicationUser>
{
    public ApplicationUserManager(IUserStore<ApplicationUser> store) : base(store)
    {
    }
}
公共类ApplicationUserStore:UserStore
{
公共ApplicationUserStore(ApplicationDbContext上下文):基础(上下文)
{
}
}
公共类应用程序管理员:UserManager
{
公共应用程序服务器管理器(IUserStore存储):基本(存储)
{
}
}
然后,UI项目中有一个控制器,它只调用BusinessLayer中的“CreateUser”函数。CreateUser函数如下所示:

public class ApplicationUser : IdentityUser

{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int AccountTypeId { get; set; }
    public DateTime CreatedOn { get; set; }
    public string CreatedBy { get; set; }

}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext() : base("AdsTracker_DevEntities")
    {
    }
}
 public async Task<string> AddUser()

    {
        ApplicationUser user;
        ApplicationUserStore Store = new ApplicationUserStore(new ApplicationDbContext());
        ApplicationUserManager userManager = new ApplicationUserManager(Store);
        user = new ApplicationUser
        {
            FirstName = "Lilian",
            LastName = "Cobian",
            AccountTypeId = 1,
            UserName = "test.test",
            Email = "prueba@gfrmedia.com",
            CreatedOn = DateTime.Now

        };

        var result = await userManager.CreateAsync(user, "P@ssword");
        if (!result.Succeeded)
        {
            return result.Errors.First();
        }
        return "User Added";

    }
公共异步任务AddUser()
{
应用程序用户;
ApplicationUserStore=新的ApplicationUserStore(新的ApplicationDbContext());
ApplicationUserManager userManager=新的ApplicationUserManager(商店);
用户=新应用程序用户
{
FirstName=“Lilian”,
LastName=“Cobian”,
AccountTypeId=1,
UserName=“test.test”,
电子邮件=”prueba@gfrmedia.com",
CreatedOn=DateTime.Now
};
var result=await userManager.CreateAsync(用户,“P@ssword");
如果(!result.successed)
{
返回result.Errors.First();
}
返回“用户添加”;
}
就这样。现在,行为是什么?如果我添加一个用户名为“test.test”的用户,那么“await userManager.CreateAsync(user,”P@ssword“;”代码为“成功”,但当我去检查数据库时,没有插入任何内容。现在,如果我再次调用该函数,并尝试添加同一个用户,它将返回错误“用户名已被占用”。再一次,我去了db,那里没有任何记录!!!怎么能服用

这就是奇怪的部分。在我按照教程创建的唯一项目中,一切都很好,记录都添加到数据库中,但是当我尝试将其集成到我的实际项目中时,它的行为就像我提到的那样

这可能是因为connectionstring是在DataObjects项目的web.config中声明的,而不是在BusinessLayer中声明的吗?但是,如果数据库中没有任何记录,为什么它“知道”我已经添加了“test.test”用户

拜托,这让我快发疯了。任何帮助都将不胜感激


谢谢你

我认为它已经插入到数据库中了,也许您检查了错误的表,使用Microsoft Identity它将插入一个特殊的表名,以
Identity
或类似的名称开头。

顺便说一句,这个
Identity
的东西很烂,很复杂,没用,失控。这浪费了我一些时间,然后我发现身份验证只是一个cookie读写的东西,如果你自己做,你会重生,更多。

我终于解决了我的问题。它正在写入AppData文件夹中的localdb、.mdf。根据你们给我的几条建议,我重新检查了我的web.config。问题是,我向DataObjects项目添加了一个.edmx,指向正确的SQL数据库,这反过来又向正确的数据库添加了一个连接字符串,但我从未将该连接字符串添加到UI web.config文件中。UI是主项目,因此它的web.config似乎还需要正确的连接字符串

确保你使用的数据库正确吗?检查它是否不在localdb中:)