代码之家  ›  专栏  ›  技术社区  ›  kalan

实体框架在模型之间切换

  •  1
  • kalan  · 技术社区  · 16 年前

    我公司有一个遗留应用程序仍在使用中。我正在把它移植到ASP.NET(使用MVC框架)中,还必须创建新的功能。因为它正在使用中,我必须在现有数据库的基础上开发它,而现有数据库的开发非常糟糕(并非所有关系都存在,使用触发器而不是关系,很多字段不再使用),所以我计划稍后创建一个新的数据库。我计划制作一个不同的ef模型,但是为了保持所有的名称空间和类名不变,这是正确的吗?如果我想把它换回去呢?如何组织我的代码、模型…等,使切换到不同的数据库更容易。 我非常感谢你的帮助。

    编辑 更准确地说,我想让我的应用程序在新的和旧的数据库上运行。请记住,2个DBS的模式不同

    2 回复  |  直到 16 年前
        1
  •  1
  •   Craig Stuntz    16 年前

    如果您想要取两个不同的数据库,并将它们视为同一个数据库,就您的应用程序而言,那么您需要在它们之间有一个隐藏差异的抽象层。

    我想你有几个选择。一种方法是使用两个不同的EF模型,然后您看到存储库模式来抽象它们之间的差异。第二种选择是进行某种条件映射。

    对于数据库之间的差异,您并不是非常具体,因此很难给出每个选项的具体示例,但第一种方法的一般思想是编写一个表示存储的接口,如下所示:

    interface IAnimalRepository
    {
        IQueryable<Animal> SelectAll();
        Animal Insert(Animal newRecord);
        // etc.
    }
    

    现在,您可以针对这个接口而不是直接针对上下文编写服务/业务层。

    您可以实现“旧”ef映射的接口,如下所示:

    class AnimalRepository: IAnimalRepository
    {
        private OldEntities Context { get; set; }
    
        public AnimalRepository(OldEntities context)
        {
            this.Context = context;
        }
    
        IQueryable<Animal> IAnimalRepositorySelectAll()
        {
            return from oa in Context.OldAnimals
                   select new Animal  // Animal is a POCO
                   {
                       Id = oa.Id,
                       Name = oa.Name
                   };
        }
    
        // etc.
    }
    

    第二个选项是进行条件映射。在这种情况下,您将使用新的代码优先功能,该功能当前位于实体框架4的CTP中,它允许您在运行时指定表名和行名。

    在这两个选项中,我可能会选择存储库模式选项,因为我认为您无论如何都要使用存储库模式。它使得单元测试和其他关注点变得更简单。但任何一个都可以。

        2
  •  0
  •   Calanus    16 年前

    我有一个类似的情况,我有一个非ef基于Oracle的应用程序。我将它切换到基于SQL Server EF的数据库系统,并在此基础上重新构建了应用程序。当您移植到一个新框架(ASP MVC)时,我所要做的也是从数据库重新开始。您可以做的是编写C代码来完成从旧数据库到新数据库的导入,并在字段之间进行任何转换等,作为导入过程的一部分。当我进行转换时,我每晚都会从旧系统导入新系统,这样用户就可以在看到现有数据时跟上新系统的速度。

    推荐文章