我伪造了一个IDbConnection,我想打电话给QueryOne<T>()(一个Dapper扩展名),但我NullReferenceException这样做了.
这是我的代码:
IDbConnection myConnection = A.Fake<IDbConnection>();
A.CallTo(() => myConnection.QueryOne<MyDto>(A<string>.Ignored, <IDbConnection>.Ignored, A<IDbTransaction>.Ignored))
.Returns(new MyDto());
Run Code Online (Sandbox Code Playgroud)
是不是可以模拟泛型方法调用FakeItEasy或为什么我得到异常?
提前致谢...
基督教
您可以使用SQL CE执行多个语句,这一直是事实.事实上,我正在使用SQL Server Compact Toolbox来做到这一点.但是,当我采用相同的多语句命令并从Dapper执行它们时......
public const string SampleDml = @"
INSERT INTO [Plugin](Name, TypeName) VALUES ('Blog','Shroom.Blog');
GO
INSERT INTO [ContentDef](PluginID, Name, Placement, IsStatic) VALUES(@@IDENTITY,'MyBlog','Layout:Left',1);
GO
";
Run Code Online (Sandbox Code Playgroud)
然后我不断收到此错误:
解析查询时出错.[令牌行号= 3,令牌行偏移= 1,令牌错误= GO]
我正在使用的SQL CE库的版本是版本4.0.0.0(运行时版本v2.0.50727).我正在使用Dapper 1.12.0.0(运行时版本v4.0.30319)和Dapper Extensions 1.3.2.0(运行时版本v4.0.30319).
SQL CE库看起来像是错误的运行时,但是Web平台安装程序说我有最新的(所以这真的是最新的?).思考?
我已经使用Dapper.NET了一段时间了.我只是想知道是否有可能让Dapper修剪字符串,因为它将它们分配给对象的属性.
我目前LTRIM(RTRIM(fieldname))在SQL和/或value.Trim()属性设置器中使用.
然而,我正在使用使用chars而不是varchar的遗留数据库,我想知道是否有办法减少我必须修剪所有内容的时间.
我通过编辑dapper的源代码自己去了,但最终打破了其他映射等所以放弃了.
只是想知道是否有人有任何可以减少这种开销的建议.(我可能会遗漏一些非常简单的东西!)
顺便说一句,我正在使用C#3.5.
我有一个用户角色(简单,第一次切割)实现的类:
class User {
public Role Role { get; set; }
// ...
public User() { this.Role = Role.Normal; }
public void Save() { Membership.CreateUser(...) } // System.Web.Security.Membership
}
enum Role : int {
Invalid = 0,
Normal = 1,
SuperUser = 4096
}
Run Code Online (Sandbox Code Playgroud)
在添加角色之前,一切正常(如果这很重要).
现在,当我尝试获取用户时,此行失败:
toReturn = conn.Query<User>("SELECT TOP 1 * FROM dbo.UserProfile WHERE 1=1");
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪(来自ELMAH):
System.Data.DataException: Error parsing column 2 (Role=1 - Int16) ---> System.InvalidCastException: Specified cast is not valid.
at Deserialize06df745b-4fad-4d55-aada-632ce72e3607(IDataReader )
--- End of inner exception …Run Code Online (Sandbox Code Playgroud) 在我看来,dapper.query对象有一个datareader,对于dapper.Execute有一个ExectureNonQuery对象.如果我错了,请纠正我.
我们可以将dapper用于返回多个表的数据集吗?
我正在寻找为Dapper交换一些EF代码优先的数据库请求,以加速我们网站的一些缓慢部分.我刚刚开始尝试,而Dapper看起来很好.
我已经成功转换了一些代码以使用.Query扩展.但是现在我正在尝试.QueryMultiple,然后使用.Read扩展来获取每个结果集.
我试图将Dapper代码移动到一个新项目中,以使其远离我的MVC项目,并且.Query的东西很好.但是当我尝试使用.QueryMultiple访问一个方法时,在它甚至命中代码中的任何断点之前我都会收到错误:
Method not found: 'System.Collections.Generic.IEnumerable`1<!!0> GridReader.Read(Boolean)'.
Run Code Online (Sandbox Code Playgroud)
如果我将代码移动到Web项目中,它可以正常工作.
我无法弄清楚我需要什么或缺少什么.Visual Studio和ReSharper看起来很开心.它正在编译.这只是一个运行时问题.这两个项目都针对.Net 4.5,两者都有对Dapper的nuget引用.Dapper项目设置为Win C#类库.我已经查看了SqlReader.cs的源代码,它似乎没有任何'使用',我还没有.我相信System.Collections.Generic是自动包含的,并且在添加引用对话框中似乎无法选择.
我觉得我错过了一些非常非常明显的东西......
这是代码:
using (var conn = new SqlConnection(ConnectionString))
{
conn.Open();
// TODO: Add in checks
const string query = @"
SELECT * FROM FileCollections WHERE Id = @fileCollectionId
SELECT * FROM Files f WHERE FileCollection_Id = @fileCollectionId
SELECT * FROM ExternalLinks WHERE FileCollection_Id = @fileCollectionId
";
// return a GridReader
using (var result = conn.QueryMultiple(query, new {fileCollectionId}))
{
var fileCollection = result.Read<FileCollection>().Single();
var files = result.Read<File>().ToList();
fileCollection.Files …Run Code Online (Sandbox Code Playgroud) 任何人都可以对Gapmpse与Dapper的使用有所了解,还是纯粹只是为了Entity Framework?
编辑
public List<UserRole> GetUserRoles(string userName)
{
using (var block = new TransactionBlock())
{
const string sql = "SELECT AspNetRoles.Name FROM AspNetUsers INNER JOIN " +
"AspNetUserRoles ON AspNetUsers.Id = AspNetUserRoles.UserId INNER JOIN " +
"AspNetRoles ON AspNetUserRoles.RoleId = AspNetRoles.Id " +
"WHERE (AspNetUsers.UserName = @userName)";
var results = TransactionBlock.Connection.Query<UserRole>(sql, new{userName}, transaction: TransactionBlock.Transaction).ToList();
block.Commit();
return results;
}
}
Run Code Online (Sandbox Code Playgroud)
*编辑*
public class TransactionBlock : IDisposable
{
private bool m_FirstTransactionBlock = false;
private bool m_Disposed = false;
public TransactionBlock(string connectionStringConfigKey …Run Code Online (Sandbox Code Playgroud) 我有一个利用Dapper的数据访问层,但不禁觉得它可以更加优雅.DAL只是传递参数并根据模型的命名响应映射模型,因此该部分至少是直接的,但我讨厌看起来重复的代码.
这是一个例子
public IEnumerable<Product> ProductSearch(int? userId, DateTime? modifiedAfter, DateTime? modifiedBefore, Guid? productId)
{
IList<Product> products;
using (var connection = _connection.OpenConnection())
{
const string sproc = "dbo.stp_Product_Search";
products = connection.Query<JobProduct>(sproc, new
{
User_ID = userId,
Modified_After = modifiedAfter,
Modified_Before = modifiedBefore,
Product_ID = productId
}, commandType: CommandType.StoredProcedure)
.ToList();
}
return products;
}
Run Code Online (Sandbox Code Playgroud)
我有很多这样的代码,但使用了不同的参数和实体.有没有人有任何好的例子?
我正在使用dapper和C#7 ValueTuples(已安装的nuget)执行以下查询:
await connection.QueryAsync<(int, Guid)>(
$@"SELECT tenant, pid FROM Table
ORDER BY id
OFFSET {skip} ROWS
FETCH NEXT {dbBatchSize} ROWS ONLY");
Run Code Online (Sandbox Code Playgroud)
它返回0和Guid.Empty的列表.
如果我只使用int或只使用Guid它可以正常工作
我还尝试根据表中的列命名ValueTuple:
await connection.QueryAsync<(int tenant, Guid pid)>("...")
Run Code Online (Sandbox Code Playgroud)
结果相同.
有人有任何提示吗?提前致谢!
我的ASP.Net Core 2.1 Web API项目中有一个模型对象,如下所示:
public class Tenant
{
public Guid Id { get; set; }
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
并且正在像这样在postgres中执行插入:
public async Task<int> CreateItem(Tenant item)
{
return await db.ExecuteAsync($@"INSERT INTO tenants (Name) VALUES (@Name)", item);
}
Run Code Online (Sandbox Code Playgroud)
我需要Guid来驱动后续逻辑。它返回受影响的行(1)。我的研究表明,有一些技巧可用于获取自动增量ID(例如使用“ MAX”等)。
有没有办法做到这一点,最好是通过dapper?还是我需要退回到ADO.Net?
dapper ×10
c# ×4
generics ×2
.net ×1
asp.net-core ×1
asp.net-mvc ×1
c#-4.0 ×1
c#-7.0 ×1
fakeiteasy ×1
glimpse ×1
postgresql ×1
sql ×1