Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在EF4中的构造函数中写入通用实体名?_C#_Linq_Entity Framework_Entity Framework 4_Generics - Fatal编程技术网

C# 如何在EF4中的构造函数中写入通用实体名?

C# 如何在EF4中的构造函数中写入通用实体名?,c#,linq,entity-framework,entity-framework-4,generics,C#,Linq,Entity Framework,Entity Framework 4,Generics,我尝试在EF4中编写通用存储库。但是我的代码看起来不太好。因为表达式不是泛型的 我要转换此代码: public class DataRepository<T> : IRepository<T> where T : class { private ExpressionsEntities _context; public DataRepository() { } public DataRepository(Expression

我尝试在EF4中编写通用存储库。但是我的代码看起来不太好。因为表达式不是泛型的

我要转换此代码:

public class DataRepository<T> : IRepository<T> where T : class
{
    private ExpressionsEntities _context;
    public DataRepository()
    {
    }

    public DataRepository(ExpressionsEntities context)
    {
        _context = context;
    }
}
公共类数据存储库:IRepository,其中T:class
{
私人表达实体(上下文);
公共数据存储库()
{
}
公共数据存储库(ExpressionsEntities上下文)
{
_上下文=上下文;
}
}
对下列事项:

public class DataRepository<T> : IRepository<T> where T : class
{
    private GetGenericEntityCONTEXT _context;

    public DataRepository()
    {
    }

    public DataRepository(GetGenericEntityCONTEXT  context)
    {
        _context = context;
    }
}
公共类数据存储库:IRepository,其中T:class
{
私有getGenericeEntityContext\u上下文;
公共数据存储库()
{
}
公共数据存储库(GetGenericeEntityContext上下文)
{
_上下文=上下文;
}
}
因为ExpressionEntities不是全局我的实体:ExpressionEntities 1、ExpressionEntities 2、ExpressionEntities 3等。。。我需要编写get take实体,例如:

public class DataRepository<T> : IRepository<T> where T : class
{
    private Entity _context;
    public DataRepository()
    {
    }

    public DataRepository(Entity context)
    {
        _context = context;
    }

    public class Main
    {
        main()
        {
            new DataRepository(ExpressionEntities)
        }
    }
}
公共类数据存储库:IRepository,其中T:class
{
私人实体(语境),;
公共数据存储库()
{
}
公共数据存储库(实体上下文)
{
_上下文=上下文;
}
公共班机
{
main()
{
新数据存储库(ExpressionEntities)
}
}
}

无法100%确定您的要求-据我所知,您无法基于t动态创建实体集

这很简单:

public class DataRepository<T> : IRepository<T> where T : class
{
   private ObjectContext _ctx; 

   public DataRepository<T>(ObjectContext ctx)
   {
      this._ctx = ctx;
   }

   public IObjectSet<T> CurrentEntitySet<T>()
   {
       get
       {
          var entityName = _plularizer.Pluralize(typeof(T).Name);
          string entitySetName = string.Format("{0}.{1}", EntityContainerName, entityName);
          return _ctx.CreateObjectSet<T>(entitySetName );  
       }
   }
}
基本上,我们正在使用多重化(Entity Framework使用相同的代码对实体集名称进行多重化),以及
CreateObjectSet

因此,如果您创建了一个
数据存储库
,它将转换为一个实体集名称Apples(该名称应与模型上的实体集相匹配),我们将基于此创建一个实体集

EntityContainerName属性是您的EDMX上的内容-您应该通过ctor传递它(最好通过DI)


这回答了你的问题吗?

我更喜欢这样的实体名

EntityContainer container=context.MetadataWorkspace.GetEntityContainer(context.DefaultContainerName,DataSpace.CSpace)

EntitySetBase entitySet=container.BaseEntitySets.Where(item=>item.ElementType.Name.Equals(typeof(T.Name)).FirstOrDefault()

var entityName=entitySet.Name


如果有些类是复数的,而有些类不是复数的,这会处理一些情况。

Loo请看上面的代码:我的代码是通用的,但表达式实体不是通用的。根据上面的代码,我应该编写每个实体。@Phsika-什么是“表达式实体”-这是您的数据上下文吗?我会猜一猜,然后说是,然后更新我的答案。不,你不需要每个实体都有一个存储库。每个聚合根都应该有一个存储库。为每个聚合根创建一个接口,并注入DataRepository或特定的存储库(从DataRepository派生,从而满足接口契约)。通用存储库的全部目的是减少实现的数量。谢谢:)ExpressionsEntities是我的datacontextwait me 5分钟我会;)再次感谢你是伟大的,但我想用它现在。。。
public class AppleRepository : DataRepository<Apple>
{
   public AppleRepository(IObjectContext ctx) : base(ctx) {}

   public ICollection<Apple> FindApples(Func<Apple,bool> predicate)
   {
      return CurrentEntitySet.Where(predicate).ToList();
   }
}
var repository = new AppleRepository(new ExpressionEntities()); // should be DI'ed