实体框架不会在DB中创建表

时间:2011-05-05 23:26:58

标签: entity-framework asp.net-mvc-3 entity-framework-4.1

首先,我不知道我正在使用的实体框架版本。我假设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()可以通过,但是没有创建表?

我做错了什么?

编辑:我认为如果我尝试创建一个具有相同用户名的条目(显然不能因为它是一个主键),那么该表就会出现,它会抛出一个异常,说该条目已经存在。

但我似乎无法找到桌子!

1 个答案:

答案 0 :(得分:4)

您正在使用EF 4.1并且预期会出现这种情况。您正在使用现有数据库,在这种情况下,EF不会为您创建表。具有默认功能的EF只能一起创建数据库和所有表。成员资格API不使用EF,因此您的第二次测试会员资格失败(用户名必须是唯一的)而不是EF。

要解决您的问题,您必须手动在数据库中创建表,或者您必须让EF创建数据库,这将有点难,因为它必须为您创建所有相关的ASP.NET表。一种方法是将这些表脚本编写为外部SQL文件,并在自定义初始化程序中执行该文件。对于自定义初始化程序,请检查this answer。这种方式不喜欢包含GO命令的脚本。如果要将脚本与GO命令一起使用,则必须使用SQL Server Management Objects来执行脚本(SMO)。