15

我的开发盒上有一个名为 ApplicationName_Development 的数据库,该数据库在 SQL Server 2008 R2 Developer 版上运行。

我将 .NET 成员表添加到数据库中没有问题。当我尝试让 Code First 工作时,我收到以下错误消息:

服务器在处理请求时遇到错误。异常消息是“无法检查模型兼容性,因为数据库不包含模型元数据。确保已将 IncludeMetadataConvention 添加到 DbModelBuilder 约定。

经过一番谷歌搜索,我发现我必须删除数据库并让 EF 创建数据库。这很好,但我丢失了所有的 .NET 成员表。我可以返回并再次添加成员表,但如果我的模型发生更改并且 EF 需要重新创建数据库,那么我必须再次添加成员表。

我该如何解决这个问题?

4

6 回答 6

6

这就是代码优先的工作方式。代码优先的主要思想是不要接触数据库,因为创建数据库是模型的责任。如果要自定义数据库,则必须创建自定义IDatabaseInitializer并添加自定义 SQL。

public class MyDbInitializer : DropCreateDatabaseIfModelChanges<MyContext>
{
    protected override void Seed(MyContext context)
    {
        // Here run your custom SQL commands
        context.Database.ExecuteSqlCommand("CREATE TABLE ....");
    }
}

现在您只需要在应用程序启动时设置您的自定义初始化程序:

Database.SetInitializer<MyContext>(new MyDbInitializer());

如果您不想这样做,则必须手动维护数据库并将初始化程序设置为 null。

于 2011-03-28T17:51:20.043 回答
5

在这里找到了一个更简单的解决方法。我希望这有帮助。

http://www.paragm.com/ef-v4-1-code-first-and-asp-net-membership-service/

于 2011-04-05T07:51:56.377 回答
5

另一种选择可能是使用 System.Web.Management 命名空间。我在下面的代码中取得了巨大的成功:

string connectionString = ConfigurationManager.ConnectionStrings["MyDatabaseContext"].ConnectionString;
string database = "MyDatabaseName";
SqlServices.Install(database, SqlFeatures.All, connectionString);

它只会创建数据库,然后您可以使用标准会员 API 添加用户。

于 2011-11-23T11:18:59.403 回答
3

这是另一种可能性。

如果您查看MvcMusicStore示例 - 有一个SampleData类负责在重建时为数据库播种。该类SampleData继承自DropCreateDatabaseIfModelChanges,并覆盖该Seed方法。这个类被传递给Database.SetInitializerin 中的Application_Start方法global.asax

SampleData在将父类更改为to之前,我遇到了与您相同的错误CreateDatabaseIfNotExist

然后,您可以重写该Seed方法以在启动时插入您想要的任何数据,而不会破坏数据库。

于 2011-04-27T17:57:21.513 回答
2

在开发过程中,创建 2 个数据库和两个连接字符串。一个用于 SqlMembership(使用 aspnet_regsql),一个用于您的 EF 应用程序。如果您想在生产中将它们合并到单个数据库中,只需将 web.config.release 中的连接字符串更改为相同即可。然后,EF 模型更改只会删除您的应用程序数据库,而不是您的会员数据库。

通过单独处理您的身份验证组件,您将自然地将您的身份验证系统与您的应用程序系统分离。然后,如果您想更改会员提供者,您将获得更好的设置。

随着系统的增长,您可能需要首先支持没有 EF 代码的非纯模型,因此这是沿着这条路走下去的一个很好的模板。

于 2011-09-06T15:40:37.543 回答
0

我发现不玩其他任何东西的最简单方法如下。

我第一次运行应用程序时DropAndRecreatedatabase总是在Initilizer.

这是第一次创建我的数据库。

在此之后,我将其更改为DropCreateDatabaseIfModelChanges.

于 2012-05-22T09:55:53.480 回答