Tri*_*ing 5 sql entity-framework-4.1 asp.net-mvc-3
我是asp .net mvc3的新手
我试图通过标准的asp .net成员资格提供程序存储其他用户信息.我创建了一个新的实体UserAddress,并使用成员API将其与aspnet_tables同步.
但是,现在如果我对UserAddress类进行任何更改 - asp.net不会删除并重新创建模型.我收到了错误
无法删除数据库,因为它正在使用中.
我搜索了stackoverflow和谷歌.基本上,我的问题与此类似
但是,我不确定如何实现chris建议的解决方案:
"这发生在我身上,因为我正在调用针对数据库的成员资格方法,而这正在产生冲突.我通过强制初始化程序在使用成员资格系统之前运行和播种来解决这个问题"
我很确定这就是数据库正在使用的原因,因为我的代码在数据存储库中的这一点落空了:
var userid = Membership.GetUser.ProviderUserKey.ToString();
return db.UserAddress.SingleOrDefault(a => a.UserId == userid);
Run Code Online (Sandbox Code Playgroud)
如何在成员资格系统之前强制初始化程序运行?
我的代码片段如下:
public class UserAddress
{
public int UserAddressId { get; set; }
public string UserId { get; set; }
public string FlatNo { get; set; }
public string BuildingName { get; set; }
public string Address1 { get; set; }
public string Address2 { get; set; }
public string PostCode { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Country { get; set; }
public long MobilePhone { get; set; }
}
public class NPLHWebsiteDb : DbContext
{
public DbSet<UserAddress> UserAddress { get; set; }
}
public class NPLHWebsiteInitializer : DropCreateDatabaseIfModelChanges<NPLHWebsiteDb>
{
protected override void Seed(NPLHWebsiteDb context)
{
var userAddress = new List<UserAddress>
{
new UserAddress {
UserAddressId = 1,
UserId = "153",
FlatNo = "6.4",
BuildingName = "Wilton Plaza",
MobilePhone = 9810110123,
}
};
userAddress.ForEach(a => context.UserAddress.Add(a));
context.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
谢谢
我之前遇到过这个问题,当我使用SQL Server Management studio连接到SqlExpress数据库时,在我启动项目时打开了几个查询.
如果您正在执行此操作 - 请在启动项目之前尝试从SSMS中的数据库断开连接.
据怀疑,罪魁祸首是“会员资格”。
该代码使用成员资格来查找已登录用户的地址。因此,如果我登录了网站,则将调用我的Membership表,并且SQL不允许初始化器删除并重新创建当前正在使用的表(即按Membership)。
这正是克里斯在我原来的问题中链接到的堆栈溢出问题中指出的内容
基本上,解决方案是在调用Membership之前强制数据库初始化。我不确定该怎么做。我试图通过输入URL来手动访问用户地址页面。但是,这不起作用,因为它在调用成员资格表的行再次失败。
正确的方法是在Application start中强制进行如下初始化:
System.Data.Entity.Database.SetInitializer(new MyInitializer());
MyContext db = new MyContext();
db.Database.Initialize(true);
Run Code Online (Sandbox Code Playgroud)