是否可以将新的Asp.net标识与数据库优先和EDMX一起使用?还是只使用代码优先?
下面是我所做的:
1)我创建了一个新的MVC5项目,并让新的身份在我的数据库中创建新的用户和角色表。
2)然后,我打开Database First EDMX文件并拖入新的Identity Users表,因为我还有其他相关的表。
3)保存EDMX后,Database First POCO生成器将自动创建用户类。但是,UserManager和RoleManager需要一个从新的标识名称空间(Microsoft.AspNet.Identity.IUser)继承的User类,因此使用POCO User类将不起作用。
我想一个可能的解决方案是编辑我的POCO Generation类,让我的User类从IUser继承?
或者ASP.NET Identity只与Code First Design兼容?
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
更新:遵循Anders Abel下面的建议,这就是我所做的。它是有效的,但我想知道是否有更优雅的解决方案。
1)我通过在与自动生成的实体相同的名称空间中创建一个分部类来扩展我的实体用户类。
namespace MVC5.DBFirst.Entity
{
public partial class AspNetUser : IdentityUser
{
}
}2)我将DataContext改为从IdentityDBContext继承,而不是从DBContext继承。请注意,每次更新EDMX并重新生成DBContext和实体类时,都必须将其设置回原处。
public partial class MVC5Test_DBEntities : IdentityDbContext<AspNetUser> //DbContext3)在自动生成的用户实体类中,必须将override关键字添加到以下4个字段或注释掉这些字段,因为它们是从IdentityUser继承的(步骤1)。请注意,每次更新EDMX并重新生成DBContext和实体类时,都必须将其设置回原处。
override public string Id { get; set; }
override public string UserName { get; set; }
override public string PasswordHash { get; set; }
override public string SecurityStamp { get; set; }发布于 2015-09-17 12:47:06
问得好。
我更像是一个数据库先行者。在我看来,代码优先的范例似乎不太可靠,而且“迁移”似乎太容易出错。
我想自定义aspnet身份模式,而不是为迁移而烦恼。我精通Visual Studio数据库项目(sqlpackage,data-dude),以及它在模式升级方面的出色表现。
我的简单解决方案是:
1)创建镜像.dacpac标识架构的数据库项目2)将此项目(.dacpac)的输出用作项目资源3)在需要时部署aspnet
对于MVC5来说,修改ApplicationDbContext类似乎可以让这一切顺利进行……
1)实现IDatabaseInitializer
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>, IDatabaseInitializer<ApplicationDbContext> { ... }
2)在构造函数中,发出这个类将实现数据库初始化的信号:
Database.SetInitializer<ApplicationDbContext>(this);
3)实现InitializeDatabase
在这里,我选择使用DacFX并部署我的.dacpac
void IDatabaseInitializer<ApplicationDbContext>.InitializeDatabase(ApplicationDbContext context)
{
using (var ms = new MemoryStream(Resources.Binaries.MainSchema))
{
using (var package = DacPackage.Load(ms, DacSchemaModelStorageType.Memory))
{
DacServices services = new DacServices(Database.Connection.ConnectionString);
var options = new DacDeployOptions
{
VerifyDeployment = true,
BackupDatabaseBeforeChanges = true,
BlockOnPossibleDataLoss = false,
CreateNewDatabase = false,
DropIndexesNotInSource = true,
IgnoreComments = true,
};
services.Deploy(package, Database.Connection.Database, true, options);
}
}
}https://stackoverflow.com/questions/19940014
复制相似问题