公共仓库需要到处应用基础实体类吗?我正在使用ASP.NETMVC和OnionArchitecture创建一个Intranet网站。我一直在实施存储库模式,但我被卡住了。假设我有一个带有IDDocument的文档表。所以这是我的回购协议(只有一种方法):classRepository:IRepositorywhereT:class{privatereadonlyPrincipalServerContextcontext;私有DbSet实体;//这里的构造函数和东西publicTGet(longid){returnentities.SingleOrDefault(s=>s.IDDocument==id);//这是我的问题}}问题是我不能使用它,因为T不被识别为来自文档表。解决方案是创建一个BaseEntity:publicclassBaseEntity{publicintID{get;set;}}然后我的文档POCO变成:publicclassDocument:BaseEntity{//Propertieshere}和我的repo:classRepository:IRepositorywhereT:BaseEntity{privatereadonlyPrincipalServerContext上下文;私有DbSet实体;publicTGet(longid){returnentities.SingleOrDefault(s=>s.ID==id);//这是我的问题}}但我不希望ideal这样做。我喜欢通用存储库的一点是,它允许我不必为所有不同的表(我有300多个)重复相同的代码。但是拥有BaseEntity也意味着重构很多我已经做过的事情。如果没有这个BaseEntity类,是否可以在任何POCO上应用通用回购?感谢您的帮助您正在调用Queryable.SingleOrDefault方法。它的第二个参数的类型为Expression>,因此您可以使用astitle属性手动构建表达式。简短示例:publicTGet(longid){varidName="ID"+typeof(T).Name;//对于Document将是IDDocumentvarparameter=Expression.Parameter(id.GetType());varproperty=Expression.Property(parameter,idName)varidValue=Expression.Constant(id,id.GetType());varequal=Expression.Equal(property,idValue);varpredicate=Expression.Lambda>(equal,parameter);返回实体.SingleOrDefault(predicate);}假设您编写了lambdafunction(Tobj)=>obj.IdProperty==id。这里obj是参数,idName应该存储“IdProperty”字符串。property表示obj.IdProperty,idValue表示id的值。equal表示obj.IdProperty==id,predicate表示整个表达式(Tobj)=>obj.IdProperty==id。以上是C#学习教程:通用仓库是否需要到处应用基础实体类?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
