我正在SQLExpress数据库上构建MVC3 EF Code First应用程序。对我来说非常重要的是,只要架构发生变化或类似的情况,就会自动生成数据库。现在我正在为我的应用程序添加身份验证,并查看了MVC附带的身份验证框架。但是,因为它似乎需要我每次生成新数据库时运行aspnet_regsql.exe。我真的需要Authentication表与我的应用程序数据库在同一个数据库中。
我基本上想知道我的选择是什么;
我可以在正确的方向上使用一些指针。
答案 0 :(得分:3)
您可以覆盖DbMigrationsConfiguration的种子方法或创建迁移。
然后,您应该能够执行可以从aspnet_regsql.exe生成的SQL,或者在您获得许可的情况下执行aspnet_regsql.exe。
更新1:
我最终做了如下:
Add-Migration AspNetRegSql
public partial class AspNetRegSql : DbMigration
{
public override void Up()
{
Migrate(false);
}
public override void Down()
{
Migrate(true);
}
private static void Migrate(bool down)
{
var action = down ? "R" : "A";
var connectionstring = ConfigurationManager.ConnectionStrings["DataContext"];
var arguments = string.Format(@"-Q -C ""{0}"" -{1} mrp", connectionstring, action);
var processStartInfo = new ProcessStartInfo
{
WorkingDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase).Replace(@"file:\", string.Empty),
FileName = "aspnet_regsql.exe",
Arguments = arguments,
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden
};
using (var process = Process.Start(processStartInfo))
{
process.WaitForExit();
}
}
}
然后将“aspnet_regsql.exe”添加到我的项目中,并将构建操作更改为“Copy if newer”。
更新2:
我不知道NSGaga发布的图书馆 - 我没有看过,但建议你也考虑一下。
更新3:
一些有用的链接:
答案 1 :(得分:3)
您可以从CodeFirst Membership Provider 开始 - 这是一个基于代码的自定义提供程序 - 如果需要,还可以进行扩展(也可以通过网站上的推荐用法阅读)。
以上是IMO的最佳方式,因为您可以真正地集成这两者(例如,如果您可能需要直接访问例如会员表,与您自己的用户/客户端表等相关)。
但你也有其他选择......
a)编写自己的Db初始化程序并对数据库进行种子处理(就像这里建议https://stackoverflow.com/a/5462981/417747。注意:您可以使用不同的方法,从运行aspnet表SQL脚本到创建aspnet表的模型等。)或
b)使用'保存'数据库的Db初始化程序 - 并首先使用aspnet表准备数据库
c)(最后但并非最不重要)使用迁移(正如@Chris正确建议的那样)。迁移非常强大。您可以运行Update-Database -Script
来生成SQL而不是更改Db - 然后组合它(使用aspnet脚本或种子数据库)并将其用于创建或更新数据库。迁移需要一些学习,但再次非常值得为更复杂的事情付出努力。
希望这会有所帮助