【发布时间】:2017-05-03 04:10:58
【问题描述】:
我正在尝试使用 Dapper 构建一个通用存储库。但是,我在实施 CRUD 操作时遇到了一些困难。
这是来自存储库的一些代码:
public class GenericRepository<TEntity> : IGenericRepository<TEntity> where TEntity : class
{
internal IDbConnection Connection
{
get
{
return new SqlConnection(ConfigurationManager.ConnectionStrings["SoundyDB"].ConnectionString);
}
}
public GenericRepository(string tableName)
{
_tableName = tableName;
}
public void Delete(TEntity entity)
{
using (IDbConnection cn = Connection)
{
cn.Open();
cn.Execute("DELETE FROM " + _tableName + " WHERE Id=@ID", new { ID = entity.Id });
}
}
}
如您所见,我的删除方法将 TEntity 作为参数,它是类类型的参数。
我从我的 UserRepository 中调用我的删除方法,如下所示:
public class UserRepository : GenericRepository<User>, IUserRepository
{
private readonly IConnectionFactory _connectionFactory;
public UserRepository(IConnectionFactory connectionFactory) : base("User")
{
_connectionFactory = connectionFactory;
}
public async Task<User> Delete(User model)
{
var result = await Delete(model);
return result;
}
}
问题是我无法在通用存储库的删除操作中写入entity.Id。我得到一个错误。那么我怎样才能轻松地实现这样的 CRUD 操作呢?
这是错误信息:
TEntity 不包含“Id”的定义,并且找不到接受“TEntity”类型参数的扩展方法“Id”
【问题讨论】:
-
当您遇到错误并询问有关该错误的问题时,您需要包含该错误。在这种情况下,运行时发生的错误称为
Exception(这是错误在 .net 中的表现方式)。包括Message、Type、StackTrace,并在InnerExceptions 中一直重复此操作。使用问题上的编辑链接包含该详细信息,不要将其作为评论包含在内。另请阅读How do I ask a Good Question。 -
@Igor:这不是运行时错误。检查我更新的问题。
-
你所使用的所有类型是否都有一个名为
int的公共属性,名为Id? -
是的,该属性存在。
-
@drizin 发布了一个库,它真正有助于实现这种所需的方法。 stackoverflow.com/a/65175483/11406472
标签: c# sql asp.net-mvc dapper