编程语言
首页 > 编程语言> > c#-实体框架和存储库模式概念上的困难

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");
                });
    }

    ...
}

然后,您可以查询存储库中的用户和文档,就像它们之间有直接关系一样. Heremore不错的sources,可以根据需要了解更多信息.

标签:onion-architecture,repository-pattern,c,entity-framework
来源: https://codeday.me/bug/20191025/1932399.html