我公司的遗留应用程序仍在使用中。我正在将它移植到asp.net(使用mvc框架)并且还必须创建新功能。因为它正在使用中我必须在现有数据库的基础上开发它,它的开发非常糟糕(并非所有关系都存在,触发器使用而不是关系,许多字段不再使用)所以我计划稍后创建一个新的数据库。我打算制作一个不同的EF模型,但要保持所有名称空间和类名相同,是不是?如果我想将其切换回来怎么办?如何组织我的代码,模型,...等,以便更容易切换到不同的数据库。 我真的很感激任何帮助。
编辑更确切地说,我想让我的应用程序在新旧数据库上运行。请记住,2 dbs的架构是不同的
答案 0 :(得分:1)
如果您想要使用两个不同的数据库并将它们视为同一个数据库,那么就您的应用程序而言,那么您需要在它们之间进行一层隐藏差异的抽象。
我认为你有几个选择。一种方法是使用两种不同的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.
}
第二个选项是进行条件映射。在这种情况下,您将使用新的Code First功能,该功能当前位于CTP for Entity Framework 4中,允许您在运行时指定表名和行名。
在这两个选项中,我可能会选择存储库模式选项,因为我认为您仍然希望使用存储库模式。它使单元测试和其他问题变得更加简单。但任何一个都可以。
答案 1 :(得分:0)
我有类似的情况,我有一个非ef基于Oracle的应用程序。我将其切换到基于SQL Server EF的数据库系统,并在其上重建了应用程序。当你移植到一个新的框架(ASP MVC)时我会做的也是从数据库开始。您可以做的是编写c#代码以执行从旧数据库到新数据库的导入,在字段等之间进行任何转换,作为导入过程的一部分。当我进行转换时,我每晚都会从旧系统导入新系统,这样用户就可以快速了解新系统,因为他们可以看到现有数据。