EF 4.1 Code First和现有数据库和.NET成员

时间:2011-03-28 15:42:48

标签: ef-code-first entity-framework-4.1

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

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

  

服务器遇到错误   处理请求。例外   消息是“模型兼容性不能   检查,因为数据库   不包含模型元数据。确保   IncludeMetadataConvention有   已被添加到DbModelBuilder中   约定。

经过一些谷歌搜索,我发现我必须删除数据库,让EF创建数据库。这没关系,但我丢失了所有的.NET会员表。我可以返回并再次添加成员资格表,但如果我的模型发生变化而EF需要重新创建数据库,那么我必须再次添加成员资格表。

我该如何解决这个问题?

6 个答案:

答案 0 :(得分: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 ....");
    }
}

现在您只需要在启动应用程序时设置cutom intializer:

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

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:5)

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

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

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

答案 3 :(得分:3)

这是另一种可能性。

如果查看MvcMusicStore示例 - 有一个SampleData类负责在重建时为数据库设定种子。 SampleData类继承自DropCreateDatabaseIfModelChanges,并覆盖Seed方法。此类将传递到Database.SetInitializerApplication_Start方法中的global.asax

在我将SampleData的父类更改为CreateDatabaseIfNotExist之前,我遇到了同样的错误。

然后,您可以覆盖Seed方法,以便在启动时插入您想要的任何数据,而不会使数据库流失。

答案 4 :(得分:2)

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

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

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

答案 5 :(得分:0)

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

我第一次使用DropAndRecreatedatabase Initilizer运行应用程序。

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

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