当前位置: 首页 > 面试题库 >

EF5代码优先:检测它是否创建数据库,以便我可以运行ALTER语句

毕衡
2023-03-14
问题内容

我是Entity Framework 5的新手。我们的团队正在使用Code First工作流。

在开始我的主要问题之前, 让我先向您展示我已经尝试过的东西所有时间的最终评语:D)。

public class MyDBContext : CDBContext
{
    public MyDBContext() : base(connString) { }

    public MyDBContext(string connStr) : base(connStr) { }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // removes some conventions
        modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
        // ........

        // model configurations which contains mappings
        modelBuilder.Configurations.Add(new AccountConfiguration());
        // ........

        // calls base OnModelCreating
        base.OnModelCreating(modelBuilder);
    }

    // list of all Entity
    public DbSet<Account> Account { get; set; }
}

MyDBContext是我创建的类,该类继承自CBDContext,其中包含重写方法,该类也继承自DBContext。我遇到的问题之一是实体框架无法处理字段唯一性。我已经在他们的站点上阅读了有关使用Fluent
API配置/映射属性和类型
的文章,但是找不到用于将属性设置为唯一的任何配置。

因此,为了将字段设置为唯一,我要做的是在创建过程中手动运行多个ALTER sql语句,

using (MyDBContext _context = new MyDBContext(connString))
{
    if (_context.Database.CreateIfNotExists()) 
    {
        _context.Database.ExecuteSqlCommand("ALTER TABLE Account ADD CONSTRAINT UQ_Account_AccountNumber UNIQUE(AccountNumber)");
        _context.Database.ExecuteSqlCommand("ALTER TABLE Account ADD CONSTRAINT UQ_Account_GUID UNIQUE(GUID)");
        // .... more on this in the following lines ...
    }
}

我的问题:

  1. 我是否正确,实体框架 没有任何配置或数据注释设置字段唯一
  2. 有没有一种方法可以在运行时检测或知道EF是否创建数据库,因此我可以将该语句移动或隐藏到if (_context.Database.CreateIfNotExists())某个可以覆盖的可用方法的某个位置?

我真正想要的是if (_context.Database.CreateIfNotExists())从使用状态寄存器中删除并将其放置在其他位置或内部,MyDBContext以便我的代码看起来像这样,

using (MyDBContext _context = new MyDBContext(connString))
{
    Account _acc = new Account()
    // ...Account properties ...

    _context.Account.Add(_acc);
    _context.SaveChanges();
}

谢谢。


问题答案:

如果您不使用(或不能使用)EF迁移,则可以使用此答案中提到的自定义初始化程序。自定义初始化程序将Seed在创建数据库后执行一个方法=仅在数据库不存在时执行一次。如果您需要逐步开发数据库初始化程序本身,将无济于事(这就是迁移的目的)。



 类似资料:
  • 问题内容: 我正在研究一个小型django项目,该项目稍后将部署在servlet容器中。但是,如果我使用cPython而不是Jython,开发速度会更快。因此,我想做的是测试我的代码是否在settiings.py中的cPython或Jython上运行,以便我可以告诉它使用适当的数据库驱动程序(postgresql_psycopg2或doj.backends.zxjdbc.postgresql)。有

  • 问题内容: 简而言之,我需要能够将已编译的可执行文件粘贴到Java jar文件中,然后能够从Java运行它(可能通过)。 的 原因 ,是我想使用Java来包裹ImageMagick的可执行文件成分的图像处理弹性的Map Reduce任务。EMR只希望获取一个jar文件,因此我认为没有空间在旋转的数据节点上安装软件。 问题答案: jar中的可执行文件是一种资源,您可以通过Stream访问它,并将可执

  • 问题内容: 我正在研究一个小型django项目,该项目稍后将部署在servlet容器中。但是,如果我使用cPython而不是Jython,开发速度会更快。因此,我想做的是测试我的代码是否在我的settiings.py中的cPython或Jython上运行,以便我可以告诉它使用适当的数据库驱动程序(postgresql_psycopg2或doj.backends.zxjdbc.postgresql)

  • 问题内容: 我在jenkins中有一组构建作业,可以在3个构建节点中的任何一个中运行。它们都带有通用标签“ ubuntu_build”。每个节点都有许多执行程序,因此允许某些构建在计算机上并行执行。该安装程序运行正常,可以完成预期的工作,但我想对其进行改进。 3个构建节点具有不同的性能。第一个是第二个的两倍,第二个是第三个的两倍。(称它们为fast_node,regular_node,slow_n

  • 问题内容: 现在我有了一些C源代码,我想在我的Java应用程序中使用它。我需要执行C源代码,并将结果返回到我的Java应用程序。与其将所有C源代码重写为Java,我如何在Java应用程序中重用C源代码? 问题答案: 看一下Java Native Interface 。 Java本机接口(JNI)是一种编程框架,它使Java虚拟机(JVM)中运行的Java代码能够被本机应用程序(特定于硬件和操作系统

  • 问题内容: 正如标题所说。我想编写一个行为不同的脚本,具体取决于它是在控制台窗口中运行还是在IDLE中运行。是否只有在我可以检查的IDLE中运行时才存在的对象?环境变量? 我在Windows上使用的是Python 2.6.5和2.7。 编辑: 到目前为止给出的答案有效。 但是我正在寻找一种官方的方式来做到这一点,或者看起来像黑客一样。如果有人提出,我会接受的。否则,几天后,我会接受最早的答案。谢谢