c#-实体框架和存储库模式概念上的困难
作者:互联网
我使用ASP.NET MVC和SQL Server 2012创建一个Intranet网站.我使用Onion Architecture创建存储库并进行架构设计.我的问题是,我工作的公司已经有几个服务器DB,其中的表之间没有任何关系.相反,有一些表可以映射这些关系.例如,一个表User和一个表Document具有一个表User_joint_Document来建立关系,该表包含两个ID(IDDocument和IDUser).现在,当我编写通用存储库时:
class Repository<T> : IRepository<T> where T : class
问题是通用类型T没有意义,而且我无法使用EF查询来影响模型中的值,这很正常,而最好的办法是让父类BaseEntity为每个表定义ID,然后我可以写:
class Repository<T> : IRepository<T> where T : BaseEntity
而且我所有的表模型都将从BaseEntity继承.但这也意味着以关系方式重写整个数据库并手动映射每个数据库POCO(如果我输入错了,请纠正我),而且我没有技能来做到这一点(不同服务器数据库中有300多个表)而且我缺乏适当的知识和经验来进行此类操作).
有没有办法保持我的原始数据库结构,并仍然编写通用存储库?人们将如何去做呢?
编辑澄清我的问题,因为@saeb部分回答了我的问题.在没有DB POCO的父类的情况下,我可以有一个通用的仓库吗?还是我只需要一个存储库来统治所有存储库?例如:
class Repository<T>:IRepository<T> where T : class
{
private readonly ApplicationContext context;
private DbSet<T> entities;
public Repository(PrincipalServerContext context)
{
this.context = context;
entities = context.Set<T>();
}
public T Get(long id)
{
return entities.SingleOrDefault(s => s.IDUser == id);
//This does not work, IDUser isn't recognized
}
谢谢你的帮助!
解决方法:
… has several Server DBs in which the tables have no relations between each other …
但是他们确实有一个关系,一个Many-to-Many关系,是通过第三个映射表定义的(是否正确定义了关系是另一个主题)
… the problem is the Generic type T makes no sense and I can’t affect values in my model using EF queries …
为什么不呢?为什么不呢?考虑表示例,您将拥有两个实体,即User和Document,它们看起来像这样:
public class User
{
public int IDUser { get; set; }
public virtual ICollection<Document> Documents { get; set; }
...
}
public class Document
{
public int IDDocument { get; set; }
public virtual ICollection<User> Users { get; set; }
...
}
您可以在上下文的OnModelCreating中使用流畅的API,通过第三个表建立关系:
public class YourContext: DbContext
{
...
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasMany<Document>(u => u.Documents)
.WithMany(d => d.Users)
.Map(userJointDocument =>
{
userJointDocument.MapLeftKey("IDUser");
userJointDocument.MapRightKey("IDDocument");
userJointDocument.ToTable("User_joint_Document");
});
}
...
}
然后,您可以查询存储库中的用户和文档,就像它们之间有直接关系一样. Here是more不错的sources,可以根据需要了解更多信息.
标签:onion-architecture,repository-pattern,c,entity-framework 来源: https://codeday.me/bug/20191025/1932399.html