首先,我不知道我正在使用的实体框架版本。我假设4,但我如何检查?
其次我在web.config中有以下连接字符串:
<connectionStrings>
<add name="DBEntites"
connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
providerName="System.Data.SqlClient" />
<add name="ApplicationServices"
connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
providerName="System.Data.SqlClient" />
正如您所看到的,它们是相同的数据库。实际上它们是由asp.net Membership Provider创建的数据库。
现在我有以下模型:
public class Profile {
[Key]
public string username { get; set; }
[Display(Name = "Full Name")]
public string FullName { get; set; }
}
够简单吗?
然后我有以下连接到DB的类:
public class DBEntities : DbContext {
public DbSet<Profile> Profiles { get; set; }
}
然后在我的Account Controller中,当你选择一个新的MVC3项目时,这是VS2010创建的控制器。
[HttpPost]
public ActionResult Register(RegisterModel model) {
if (ModelState.IsValid) {
// Attempt to register the user
MembershipCreateStatus createStatus;
Membership.CreateUser(model.UserName, model.Password, model.Email, null, null, true, null, out createStatus);
Profile pm = new Profile();
pm.username=model.UserName;
pm.FullName="unknown";
db.Profiles.Add(pm);
db.SaveChanges();
if (createStatus == MembershipCreateStatus.Success) {
FormsAuthentication.SetAuthCookie(model.UserName, false /* createPersistentCookie */);
return RedirectToAction("Index", "Home");
} else {
ModelState.AddModelError("", ErrorCodeToString(createStatus));
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
因此,当我运行此应用程序时,它会毫无例外地运行。如果我添加新用户,则新用户将添加到asp.net成员资格表中。因此,根据我的理解,Entity框架应该创建一个名为“Profile”的表,其中包含两列“username”和“fullname”。
然而,它不是。为什么代码可以顺利通过而没有例外,db.SaveChanges()
可以通过,但是没有创建表?
我做错了什么?
编辑:我认为如果我尝试创建一个具有相同用户名的条目(显然不能因为它是一个主键),那么该表就会出现,它会抛出一个异常,说该条目已经存在。
但我似乎无法找到桌子!
答案 0 :(得分:4)
您正在使用EF 4.1并且预期会出现这种情况。您正在使用现有数据库,在这种情况下,EF不会为您创建表。具有默认功能的EF只能一起创建数据库和所有表。成员资格API不使用EF,因此您的第二次测试会员资格失败(用户名必须是唯一的)而不是EF。
要解决您的问题,您必须手动在数据库中创建表,或者您必须让EF创建数据库,这将有点难,因为它必须为您创建所有相关的ASP.NET表。一种方法是将这些表脚本编写为外部SQL文件,并在自定义初始化程序中执行该文件。对于自定义初始化程序,请检查this answer。这种方式不喜欢包含GO
命令的脚本。如果要将脚本与GO
命令一起使用,则必须使用SQL Server Management Objects来执行脚本(SMO)。