- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
尝试将 Linq to SQL 用于我在家进行的一个小项目。我使用 dbmetal.exe(来自 DBLinq 项目)针对本地 MySQL 数据库生成了上下文代码和我的所有实体类。
一切都运行良好,但我正在尝试提取一些冗余代码,但在尝试这样做时遇到了问题。
基本上我所有的实体都是Table<TEntity>
类型的在我的上下文类中。例如我有 Table<User>
和 Table<Calendar>
.
当我为存储库行为设计各种接口(interface)时,我意识到每个实体都有一些非常冗余的方法。例如 ID 字段:
User findById(int id);
Calendar findById(int id);
我设计了我的表格,所以它们都有 3 个共同的字段 [ID、DATECREATED、DATEUPDATED]。由于这些字段很常见,我希望有一个共同的行为,而不是为每个实体重写这些方法。
所以我让我的存储库类(UserRepository、CalendarRepository)继承了一个通用的“存储库”类,它是这样定义的:
public class Repository<T> : IDisposable, IRepository<T> where T : class
{
protected MyContext context;
private DbLinq.Data.Linq.Table<T> currentTable;
protected Repository() {
context = new MyContext();
Type currentType = this.GetType().GetGenericArguments()[0];
currentTable = //Set currentTable based on currentType. e.g.: currentTable = context.User;
}
#region IRepository<T> Members
public T findById(int? id)
{
return currentTable.SingleOrDefault(d => d.ID == id);
}
public T findByDateCreated(DateTime dateCreated)
{
return currentTable.SingleOrDefault(d => DateTime.Equals(dateCreated, d.DateCreated));
}
public T findByDateUpdated(DateTime dateUpdated)
{
return currentTable.SingleOrDefault(d => DateTime.Equals(dateUpdated, d.DateUpdated));
}
public T insert(T domainObject)
{
currentTable.InsertOnSubmit(domainObject);
return domainObject;
}
public T save(T domainObject)
{
context.SubmitChanges();
return domainObject;
}
#endregion
#region IDisposable Members
public void Dispose()
{
if (context != null)
context.Dispose();
}
#endregion
}
事实证明这比我想象的要难。当我尝试设置时:
currentTable = (Table<T>)context.User;
我收到以下错误:
Cannot convert type 'DbLinq.Data.Linq.Table<Models.Domain.User>' to 'DbLinq.Data.Linq.Table<T>'
隐式转换也不起作用。
有人成功做过类似的事情吗?如果我必须让我的所有 Repository 类都实现相同的 findById 方法并且其中包含完全相同的代码,那将是非常可悲的......我确信有一种方法可以不这样做,我只是找不到它. :)
最佳答案
That'd be very sad if I had to have all my Repository classes implement the same findById method with exactly the same code in it
代码并不完全相同。在每种情况下,您都指的是上下文中的不同表格。
我理解你的逻辑;你想干。但是您拥有存储库的原因是让您能够通过注入(inject)模拟存储库而不是您的真实存储库来抽象您的数据访问逻辑,以促进单元测试。最实用(和灵活)的方法是保持您的表(和您的 DAL 对象)独立且不同。通过尝试泛化部分 DAL 对象,您将引入额外的耦合,这将使您的单元测试复杂化。
关于c# - 通用表<TEntity>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1694851/
这应该很明显,但由于某种原因我无法弄清楚。所以在我的通用存储库类中,我有一个更新方法来更新实体: public void Update(TEntity entity) where TEntity :
我正在围绕 EF Core 编写一个小型包装器方法 DbSet .我有以下方法: public Task> GetAsync(Func, IQueryable> getFunction) {
我正在寻找一种将 Entity 和 TEntity 作为参数传递的方法,以便我可以将此方法用作通用方法。类似的东西: private void AttachSingleEntity(Entit
我想创建 Func, IOrderedQueryable>来自 SortingItems 的列表动态地。我的意思是我想创建以下表达式: entity => entity.OrderBy(c => c.
我正在使用这里提到的模式 http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-rep
我偶然发现了下一个问题......我有数据库上下文: // For support unit testing... public interface IDbContext : IDisposable
我有一个静态类 DataSource从文件中提取请求的数据并将其作为 List. 返回在 TestRepository (下),我正在使用通用 TEntity , 确定其类类型并从 DataSourc
我正在尝试将 DbLinq 与 SQLite 数据库一起使用,但在尝试转换 ITable 时遇到了问题作为Queryable . 在 DbLinq ( Issue 211 ) 中有一个已知的错误,这可
在 ms 文档中 Razor pages tutorial DbContext 有一个 DbSet Students 集 public class SchoolContext : DbContext
概述/描述 简单:从TEntity 中派生 的运行时类型对象的多态删除添加到 ObjectSet不会提高 IBindingList.ListChanged IBindingList 上的事件Objec
尝试将 Linq to SQL 用于我在家进行的一个小项目。我使用 dbmetal.exe(来自 DBLinq 项目)针对本地 MySQL 数据库生成了上下文代码和我的所有实体类。 一切都运行良好,但
似乎最简单的事情有时很难弄清楚...... 许多代码引用都具有 TEntity 类型,用于对实体数据模型中的实体进行一般处理。我试图在我的代码中使用它并得到:“未知类型'TEntity'”是什么给出的
更新: 我准备了一个通用函数来捕获数据库行以生成列表。我的方法就是这样的。 public class GenericDataAccess : IGenericRepository where
我想写一个通用的方法来返回任何模型,如产品、销售等。像这样的东西(.net 3.5;我不使用 Entity Framework ) public class ProductRepository : I
我想对存储库中的检索方法进行单元测试,该存储库具有模拟的 DbContext,但我无法将模拟的 DbSet 值设置到存储库。 存储库如下所示: public class ChangeLogReposi
我正在尝试讲述一种方法 GetAll()在模拟对象上 _portalUserRepositoryMock返回 IQueryable 类型的对象.我知道是这个类型,因为要测试的类中的方法返回这个类型。
我正在尝试: ... int id = 5; //DB is a instance of DbContext MethodInfo methodFind = DB.GetType().GetMetho
我有以下在 EF7 之前使用的界面。当我尝试使用 EF7 构建应用程序时,我收到以下错误,而且我似乎无法在任何地方找到这种类型。我非常感谢您就如何为 EF7 更改此代码提出建议。 Error CS02
这是我不相信的代码。请检查我如何将实体集合作为参数传递。 public ExamProduced GetExamProduced(XElement xml) { var examProduce
我正在尝试测试存储库的 Get 方法。签名如下: public virtual IEnumerable Get( Expression> filter = null,
我是一名优秀的程序员,十分优秀!