2012-02-10 51 views
30

我开始玩的代码,第一种方法的实体框架,主要目的是让我可以装饰在我看来,(否则我与注解显示属性,现在我要创建一个与实体框架为我生成的类几乎相同的类,以便我可以添加注释,然后将数据从一个对象复制到下一个)。停止实体框架的修改数据库

现在它看起来像当我开始我的应用程序它试图创建一个数据库。

我不想实体框架不断修改我的数据库。不,没有。不要尝试它。修改数据库真的不难;如果我自己这样做,我会感觉更舒适。设计数据库时,我不需要一个框架来握住我的手。

我可以告诉框架来停止试图修改我的数据库?我现在很犹豫如何使用代码,因为它试图修改我的数据库是相当可怕的。即使在发展中,我也不想看到它发生。

我运气不好吗?

+1

这听起来像你的模型不完全匹配您的数据库。你可以尝试使用你的数据库的副本,并指出EF。让它创建修改数据库并比较差异,然后相应地修改您的模型。你还应该看看EntityTypeConfiguration泛型类。 – 2012-02-10 15:24:08

+0

修改架构或修改数据? – jrummell 2012-02-10 15:34:37

+0

我们中的一些人不相信这些自动迁移,并且从设计和设置数据库的角度来看非常重要,以至于手动完成它是完全合理的。但是让EDMX离我远点......这样做的另一个原因是:一个团队可以在数据库上工作,而另一个团队设置类别/模型以匹配 - 大致平行。如果有任何变化,您不必搜索返回迁移。只需更新您的注释等。 – mmcrae 2015-12-14 18:30:22

回答

46

如果你不想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; } 
} 

http://www.entityframeworktutorial.net/code-first/turn-off-database-initialization-in-code-first.aspx

+1

您可以将其放在上下文类的静态构造函数中,如以下示例视频所示:http://msdn.microsoft.com/en-us/data/jj572367 – 2013-07-11 11:30:55

+1

它不会显示在视频中。看看这里,而不是:在这个数据库的前面,重要的是不要使用这个 – 2015-09-01 16:21:09

+1

这个答案可以改善与哪里添加此代码。 – 2015-09-18 15:00:16

3

如果你想使用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); 
+0

我同意数据库首先*听起来像我想要的,但我试图解决必须创建与为我生成的模型几乎完全相同的类的问题。我必须创建一个几乎完全相同的类,以便我可以装饰具有注释的属性以在我的视图中显示(例如,执行验证)。它导致我不得不遍历所有“EF”对象,并将它们复制/映射到带有注释的新对象。 – 2012-02-10 15:33:26

+1

我会说,你永远不应该传递你的db模型对象到你的视图。通常,您将创建另一个类,然后将其传递给您的视图,该视图只包含可用于该视图的属性。然后你会用你的验证属性装饰那个类 – 2012-02-10 15:37:22

+0

@AnthonyShaw - 我还没有看到很多人做这个例子,但这正是我现在正在做的。我觉得我对此感到担忧,因为它好像很多世俗的复制/绘图工作。是否有一种模式可用于将数据库模型对象转换为对象以在视图中显示?你通常如何做? – 2012-02-10 15:39:17

2

当你说你真是初始化器,使用基类:

public class DatabaseInitialiser : CreateDatabaseIfNotExists<MyContext> 

而不是:

public class DatabaseInitialiser : RecreateDatabaseIfModelChanges<MyContext> 

或者,如果你使用:

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

与替换此:

Database.SetInitializer<MyContext>(new CreateDatabaseIfNotExists<MyContext>); 
1

由于code first几乎完全符合您的描述,我不明白您的问题。

如果你不想让EF摆弄你的数据库,那么你现有的数据库就是generate a model

+0

没错,但是如果我从我的数据库生成模型,那么我缺少在视图中显示数据所需的数据注释。它导致了很多重复的工作;从本质上创建与生成的模型相同的类,然后使用注释修饰这些属性。我正在努力避免涉及到的所有复制工作。 – 2012-02-10 15:29:47

+0

您可以通过创建部分类或伙伴类(MetadataAttribute)来修饰生成的类。 – jrummell 2012-02-10 15:38:05

+0

有些例子是你想要做的代码其次,数据库存在,但是关系不要或者你处理Views,而Code Second方法是必需的。 – 2016-07-15 03:48:47