C# 如何在EF4中的构造函数中写入通用实体名?
我尝试在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
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