我来自PetaPoco营地.PetaPoco有一个T4模板,可以从数据库中生成模型.Dapper有类似的东西吗?
我使用NuGet安装了Dapper并添加了SqlHelper.cs,但是我没有找到任何从数据库生成模型的东西.
我刚开始研究Dapper.我正在测试它并能够做基本的CRUD,我的基本意思是在这个结构的类上工作:
public class Product {
public int Id {get;set;}
public string Name {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
现在我正在寻找能够更容易地进行插入和更新的东西,并找到了Dapper.Rainbow.我检查了它,并能够使用它来获取和插入对象,如上所述.我的问题是,当Product
有导航属性时,我不能在该字段上插入.所以,如果我有这个:
public class Product {
public int Id {get;set;}
public string Name {get;set;}
public ProductCategory Category {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
我将无法做到这一点:
// connection is a valid and opened connection
var db = TestDatabase.Init(connection , 300);
var newId = db.Products.Insert(newProduct);
Run Code Online (Sandbox Code Playgroud)
因为这个原因:
The member Category of type ProductCategory cannot be used as a parameter value
Run Code Online (Sandbox Code Playgroud)
如果我Category
用type 替换int
(数据库中的相同数据类型),则可以解决该问题.但是,如果我这样做,我将无法使用其类别信息查询产品,而不仅仅是(类别)ID.
因此,如果不使用原始Dapper,如何使用具有导航属性的类进行插入和更新?我希望我可以执行以下操作并告诉Dapper.Rainbow Category
在插入或更新时忽略.
public class Product { …
Run Code Online (Sandbox Code Playgroud) 我有下表,删节:
CREATE TABLE [dbo].[TERMINAL] (
[TERM_CODEID] SMALLINT NOT NULL,
[TERM_ACTIVE] SMALLINT NOT NULL,
[TERM_NAME] VARCHAR (30) NOT NULL,
[TERM_SLA] CHAR (8) NOT NULL,
[TERM_SERIAL] VARCHAR (8) NULL,
[TERM_VERSION] VARCHAR (8) NULL,
[TERM_STATUS] INT NULL,
)
Run Code Online (Sandbox Code Playgroud)
当我尝试以下Dapper代码 - 我是一个完整的Dapper新手,昨天发现它 - 我收到一个错误:
using (var conn = new SqlConnection("data source=ourServer; initial catalog=ourDb;user id=sa;password=ourPassword;"))
{
conn.Open();
var terms = conn.Query<Terminal>("select * from TERMINAL");
}
Run Code Online (Sandbox Code Playgroud)
错误是:
解析第3列时出错(TERM_SLA = 01010B01 - String)
我没有理由为什么甚至不得不"解析"一个字符串,更不用说在这样做时遇到错误.可能导致这种情况的原因>
我的工作最近开始使用PetaPoco
,虽然很棒但我错过了Dapper
允许将单个查询中的多个结果网格处理成pocos的功能.
结果我写了我自己的实现PetaPoco
- 如下所示 - 但是有没有人自己编写并且小心分享它?
我想可能还有其他人错过了这个功能.
我最近开始使用Dapper,一切看起来都很简单但有一件事让我感到困惑:连接管理.
根据文件:
Dapper不管理连接的生命周期,它假定它获得的连接是打开的并且没有现有的数据引用器枚举(除非启用了MARS)
鉴于此,我开始在我的存储库方法的实现中执行此操作:
using (var db = new SqliteConnection(connectionString)) {
// call Dapper methods here
}
Run Code Online (Sandbox Code Playgroud)
然后我遇到了一个包含大量记录的表,所以我IEnumerable<T>
通过传递buffered: false
给Query<>
方法返回一个,当我开始枚举前端的枚举时,繁荣一个例外,说连接被关闭并处理了预期因为我用前面的使用块包装我的调用.
问题:最好的方法来解决这个问题?
附带问题:我管理连接的方式是首选方式吗?
我们决定对Azure数据库使用微操作.由于我们的业务只需要"插入"和"选择",我们决定禁止所有代码管理SqlTransaction
(没有数据的并发问题).
然后,我们注意到我们的Azure数据库实例反应非常缓慢." rpc completed "事件发生的延迟是运行简单sql语句所需时间的数百倍.
接下来,我们使用EF6对代码进行基准测试,我们发现服务器响应非常快.当EF6实现内置事务时,我们决定恢复SqlTransaction
微观orm上的(ReadCommited),我们发现一切都很好.
Azure数据库是否需要显式SqlTransaction
(由代码管理)?SqlTransaction
Azure数据库的表现如何影响?为什么这样实现?
编辑:我将发布一些关于我们收集痕迹的方式的更准确的信息.我们的Azure事件日志有时以纳秒表示,有时以毫秒为单位.看起来很奇怪.
ado.net distributed-transactions micro-orm entity-framework-6 azure-sql-database
我有一个具有以下属性的Customer类:
public int Id { get; set; }
public string Name { get; set; }
public int AddressId { get; set; }
public Address Address { get; set; }
Run Code Online (Sandbox Code Playgroud)
我的目标是编写一个Dapper查询,该查询将使用内部联接在返回的每个Customer中填充整个Address属性。
这是我所拥有的并且正在运行,但是我想知道这是否是最干净/最简单的方法:
StringBuilder sql = new StringBuilder();
using (var conn = GetOpenConnection())
{
sql.AppendLine("SELECT c.Id, c.Name, c.AddressId, a.Address1, a.Address2, a.City, a.State, a.ZipCode ");
sql.AppendLine("FROM Customer c ");
sql.AppendLine("INNER JOIN Address a ON c.AddressId = a.Id ");
return conn.Query<Customer, Address, Customer>(
sql.ToString(),
(customer, address) => {
customer.Address= address;
return userRole;
},
splitOn: …
Run Code Online (Sandbox Code Playgroud) 目前存在ServiceStack的异步分支,可以创建异步服务.但是为了获得异步的所有好处,所有IO绑定操作都应该是异步的,因此所有数据库请求也应该是异步的.我目前正在使用OrmLite和Postgresql,因此我想知道OrmLite是否支持异步查询/操作?如果没有,其他什么.Net Micro-Orms支持异步操作?
asynchronous async-await servicestack micro-orm ormlite-servicestack
假设我有这User
门课:
public class User
{
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public DateTime DateCreated { get; set; }
public DateTime LastLogin { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想将其映射到下表:
CREATE TABLE "user" (
"ID" int(11) NOT NULL AUTO_INCREMENT,
"FirstName" varchar(45) DEFAULT NULL,
"LastName" varchar(45) DEFAULT NULL,
"Email" varchar(255) NOT NULL,
"DateCreated" int(11) NOT NULL,
"LastLogin" int(11) NOT NULL, …
Run Code Online (Sandbox Code Playgroud) 我已经创建了模型 using System.Data.Entity.Spatial;
public class Store
{
public int Id { get; private set; }
public string Name { get; set; }
public string Address { get; set; }
public DbGeography Location { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
using (SqlConnection conn = SqlHelper.GetOpenConnection())
{
const string sql = "INSERT INTO Stores(Name, Address, Location) " +
"VALUES (@Name, @Address, @Location)";
return conn.Execute(sql, store);
}
Run Code Online (Sandbox Code Playgroud)
我得到了例外 type System.Data.Entity.Spatial.DbGeography cannot be used as a parameter value
我试过寻找插入的方法,这是我能找到的最好的方法,但它试图只插入 1 个参数,我应该怎么做才能插入具有 dbgeography 成员的对象? …
micro-orm ×10
dapper ×7
c# ×6
orm ×3
ado.net ×2
.net ×1
async-await ×1
asynchronous ×1
database ×1
geospatial ×1
petapoco ×1
servicestack ×1
sql ×1
sql-server ×1