我开始使用实体框架的代码优先方法,主要是为了让我可以使用注释来装饰我的属性以便在我的视图中显示(否则,现在我必须创建一个近似的类与实体框架为我生成的那个相同,这样我就可以添加注释,然后将数据从一个对象复制到下一个对象。
现在,当我启动应用程序时,它似乎正在尝试创建数据库。
我不希望实体框架永远修改我的数据库。不,不是。甚至不尝试。修改数据库确实不难;如果我自己这样做,我会感觉更舒服。在设计数据库时,我不需要一个框架来抓住我的手。
我可以告诉框架停止尝试修改我的数据库吗?我现在非常犹豫是否使用代码优先,因为它试图修改我的数据库是相当可怕的。即使在开发过程中,我也不希望看到它发生。
我运气不好吗?
答案 0 :(得分:54)
如果您不希望EF创建数据库,则可以禁用数据库初始化程序:
public class SchoolDBContext: DbContext
{
public SchoolDBContext() : base("SchoolDBConnectionString")
{
//Disable initializer
Database.SetInitializer<SchoolDBContext>(null);
}
public DbSet<Student> Students { get; set; }
public DbSet<Standard> Standards { get; set; }
}
答案 1 :(得分:4)
如果您想使用EF但从不修改数据库,那么您可能不希望首先使用代码。你可能想要更像数据库的东西。
http://blogs.msdn.com/b/adonet/archive/2011/03/15/ef-4-1-model-amp-database-first-walkthrough.aspx
回答评论链接:
http://automapper.codeplex.com/
Getting Started with AutoMapper
编辑:我误解了目标you should reference this answer where the following correct code was given:
If you don't want EF to create your database, you can disable the database initializer
Database.SetInitializer<MyContext>(null);
答案 2 :(得分:2)
当您声明自己是初始化者时,请使用基类:
public class DatabaseInitialiser : CreateDatabaseIfNotExists<MyContext>
而不是:
public class DatabaseInitialiser : RecreateDatabaseIfModelChanges<MyContext>
或者如果您使用:
Database.SetInitializer<MyContext>(new RecreateDatabaseIfModelChanges<MyContext>);
将其替换为:
Database.SetInitializer<MyContext>(new CreateDatabaseIfNotExists<MyContext>);
答案 3 :(得分:1)
由于code first几乎完全符合您的描述,我不明白您的问题。
如果您不希望EF摆弄您的数据库,那么请从现有数据库中generate a model。
答案 4 :(得分:-1)
我知道此线程很旧,但希望OP能够找到答案。如果没有...
已让Visual Studio从现有数据库生成EF6实体类:
https://www.entityframeworktutorial.net/code-first/code-first-from-existing-database.aspx
然后添加(如前所述):
Database.SetInitializer<SchoolDBContext>(null);
阻止EF6与数据库混乱。
请注意,自动生成的类的潜在问题是生成的代码使用了流利的语言。