我的开发盒上有一个名为ApplicationName_Development的数据库在SQL Server 2008 R2 Developer Edition上运行。
我将.NET成员资格表添加到数据库中没有问题。当我尝试使Code First工作时,我收到以下错误消息:
服务器遇到错误 处理请求。例外 消息是“模型兼容性不能 检查,因为数据库 不包含模型元数据。确保 IncludeMetadataConvention有 已被添加到DbModelBuilder中 约定。
经过一些谷歌搜索,我发现我必须删除数据库,让EF创建数据库。这没关系,但我丢失了所有的.NET会员表。我可以返回并再次添加成员资格表,但如果我的模型发生变化而EF需要重新创建数据库,那么我必须再次添加成员资格表。
我该如何解决这个问题?
答案 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.SetInitializer
中Application_Start
方法中的global.asax
。
在我将SampleData
的父类更改为CreateDatabaseIfNotExist
之前,我遇到了同样的错误。
然后,您可以覆盖Seed
方法,以便在启动时插入您想要的任何数据,而不会使数据库流失。
答案 4 :(得分:2)
在开发过程中,创建2个数据库和两个连接字符串。一个用于SqlMembership(使用aspnet_regsql),另一个用于EF应用程序。如果您想将它们合并到生产中的单个DB中,只需将web.config.release中的连接字符串更改为相同即可。然后,EF模型更改将丢弃您的应用程序数据库而不是您的会员数据库。
通过单独处理您的身份验证组件,您自然会将身份验证系统与应用程序系统分离。然后,如果您希望更改成员资格提供者,您将获得更好的设置。
随着系统的发展,您可能需要首先支持没有EF代码的非纯模型,因此这是一个很好的模板,可以沿着这条路走下去。
答案 5 :(得分:0)
我发现最简单的方法是不玩其他任何东西,如下所示。
我第一次使用DropAndRecreatedatabase
Initilizer
运行应用程序。
这是第一次创建我的数据库。
在此之后,我将其更改为DropCreateDatabaseIfModelChanges
。