Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 停止实体框架修改数据库_C#_.net_Entity Framework_Entity Framework 4 - Fatal编程技术网

C# 停止实体框架修改数据库

C# 停止实体框架修改数据库,c#,.net,entity-framework,entity-framework-4,C#,.net,Entity Framework,Entity Framework 4,我开始使用实体框架的代码优先方法,主要是为了用注释装饰属性,以便在视图中显示(否则,现在我必须创建一个与entity framework为我生成的类几乎相同的类,以便添加注释,然后将数据从一个对象复制到下一个对象) 现在看起来,当我启动应用程序时,它正试图创建一个数据库 我不希望实体框架永远修改我的数据库。不,永远不要。甚至不要尝试。修改数据库真的没有那么难;如果我自己这样做,我会感觉舒服得多。我不需要框架来控制我的手,设计数据库 我能告诉框架停止尝试修改我的数据库吗?我现在很犹豫是否先使用代码

我开始使用实体框架的代码优先方法,主要是为了用注释装饰属性,以便在视图中显示(否则,现在我必须创建一个与entity framework为我生成的类几乎相同的类,以便添加注释,然后将数据从一个对象复制到下一个对象)

现在看起来,当我启动应用程序时,它正试图创建一个数据库

我不希望实体框架永远修改我的数据库。不,永远不要。甚至不要尝试。修改数据库真的没有那么难;如果我自己这样做,我会感觉舒服得多。我不需要框架来控制我的手,设计数据库

我能告诉框架停止尝试修改我的数据库吗?我现在很犹豫是否先使用代码,因为它试图修改我的数据库这一事实相当可怕。即使在开发中,我也不想看到这种情况发生


我运气不好吗?

如果您想使用EF但从不修改数据库,那么您可能不想首先使用代码。您可能需要更像数据库的东西

来自答案评论的链接:

编辑:我误解了目标

Database.SetInitializer(null);

当您声明自己是初始化器时,请使用基类:

public class DatabaseInitialiser : CreateDatabaseIfNotExists<MyContext>
公共类数据库初始化器:CreateDatabaseIfNotExists
而不是:

public class DatabaseInitialiser : RecreateDatabaseIfModelChanges<MyContext>
公共类数据库初始化器:重新创建DatabaseIfModelChanges
或者,如果您使用:

Database.SetInitializer<MyContext>(new RecreateDatabaseIfModelChanges<MyContext>);
Database.SetInitializer(新的重新创建DatabaseIfModelChanges);
将其替换为:

Database.SetInitializer<MyContext>(new CreateDatabaseIfNotExists<MyContext>);
Database.SetInitializer(新的CreateDatabaseIfNotExists);
由于与您描述的内容几乎完全相同,我不理解您的问题


如果不希望EF篡改数据库,请从现有数据库中删除。

如果不希望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; }
}
公共类SchoolDBContext:DbContext
{
public SchoolDBContext():base(“SchoolDBConnectionString”)
{            
//禁用初始值设定项
Database.SetInitializer(null);
}
公共数据库集学生{get;set;}
公共数据库集标准{get;set;}
}

请看

我意识到这条线索很旧,但希望OP能找到答案。如果不是

让Visual Studio从现有数据库生成EF6实体类:

然后添加(如前所述):

Database.SetInitializer(null);
阻止EF6干扰数据库


请注意,自动生成的类的一个潜在问题是生成的代码使用fluent。

听起来您的模型与数据库不完全匹配。您可以尝试使用数据库的副本并指向EF。让它创建修改数据库并比较差异,然后相应地修改您的模型。您还应该进行look在EntityTypeConfiguration泛型类中。修改模式或修改数据?我们中的一些人不信任这些自动迁移,他们认为设计和设置数据库非常重要,手动操作非常合理。但是让EDMX远离我…这样做的另一个原因是:一个团队可以在数据库上工作,而另一个设置类/模型以匹配-大致并行。如果有任何变化,您不必搜索回迁移。只需更新注释等。可能需要指出的是,在Entity Framework core中放弃了此行为。对,但是如果我从数据库生成模型,那么我将丢失数据在视图中显示数据所需的批注。这会导致大量重复工作;基本上创建与生成的模型相同的类,然后用批注装饰这些属性。我试图避免与此相关的所有复制工作。您可以通过创建部分类来装饰生成的类es或伙伴类(MetadataAttribute)。在一些示例中,您希望执行代码秒操作,数据库存在,但关系不存在,或者您需要处理视图,并且需要代码秒方法。您可能希望关闭此操作的一个原因是,您刚刚收到一个异常,告诉您EF试图在应用程序启动时删除整个数据库!完美的valid代码首先用于生成数据库更新,但由用户/dbadmin控制,而不是“智能地”自行擦除所有数据。我同意数据库首先听起来像是我想要的,但我正试图回避必须创建一个与为我生成的模型几乎相同的类的问题。我必须创建一个几乎相同的类,以便我可以用注释装饰属性,以便在视图中显示(例如,强制验证)。这导致我必须循环检查所有的“EF”对象,并将它们复制/映射到带有批注的新对象。我想说的是,您永远不应该将db模型对象传递给视图。通常,您会创建另一个类,然后将该类传递给视图,该类只包含该视图可用的属性。然后,您可以使用validation pro装饰该类perties@AnthonyShaw-我没有看到很多人这样做的例子,但这正是我现在正在做的。我想我对此感到担忧,因为这看起来像是很多平凡的复制/映射工作。是否有一种模式可以用于将数据库模型对象转换为要在视图中显示的对象?您是如何使用的是吗?@Ek0nomik也许是一个解决方案。它可以自动地将属性从一个类复制到另一个类,给定一些限制(近似相同的字段名等)。但是,您仍然需要定义类(您自己的模型)。@Ek0nomik,像CodeCa一样
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; }
}
Database.SetInitializer<SchoolDBContext>(null);