我正在使用ORMLite来保存许多对象,类似于:
var graphs = Builder<UserGraph>.CreateListOfSize(10)
.And(x => x.UserId = User.Id)
.Build();
Db.SaveAll(graphs);
Run Code Online (Sandbox Code Playgroud)
有没有办法让每个对象的id属性自动设置.如果没有,有没有办法获取所有插入对象的ID?
我本周末第一次发现ServiceStack,我发现它非常棒.因此,我已经在将所有项目转换为它.然后我遇到了一个小障碍.
我找不到任何文档,首先从数据库开始使用OrmLite,然后将现有模式映射到POCO.
我在代码优先发现了很多材料,但在模型优先没有.
有没有办法使用OrmLiite采用模型优先方法?
谢谢.
我对使用ServiceStack创建的一些服务类编写单元测试(使用NUnit)感兴趣,使用"New API"(继承自ServiceStack.ServiceInterface.Service).当使用AppHost在ASP.NET应用程序中托管时,服务的Db属性是正确自动连接的,但是当在该环境之外运行时,我似乎无法弄清楚正确的技术.我在ServiceStack中看到了各种与测试相关的命名空间和类,但是找不到注入服务的Db属性的明确示例,而不是简单地直接设置连接工厂然后调用各种IDbConnection扩展方法(Insert ,选择等).
我已经尝试让我的测试类继承自ServiceStack.ServiceInterface.Testing.TestBase并重写其Configure方法以注册IDbConnectionFactory(使用":memory:"),以及OrmLiteConfig.DialectProvider = SqliteDialect.Provider;在我的TestFixtureSetUp中设置,但是当我继续获得NullReferenceException时调用我的服务方法(在ServiceStack.ServiceInterface.Service.get_Db()处).似乎Funq容器没有自动连接任何东西.
SQLite本身已正确设置,我可以通过更简单的单元测试来确认,这些单元测试绕过我的服务类并直接执行直接的IDbConnection调用.
我错过了什么?
编辑
看来,单元测试ServiceStack服务需要主机和客户端的存在,虽然它看起来像有一些方法可以设置它,以避免序列化成本(使用DirectServiceClient,如图所示这里) -虽然我没有成功地让我的工作在我的情况下.我设法使用AppHostHttpListenerBase方法(参见此处)使用它,尽管它更像是集成测试而不是单元测试(因此速度较慢).
根据另一个SO 答案,SQLite 似乎不会自动强制执行外键关系,并且必须在每个连接中显式启用它。这是ServiceStack.OrmLite报告的问题。我自己使用 ServiceStack.OrmLite 3.9.33 和 SQLite 1.0.84 重现了这种行为,其中单元测试成功(允许删除具有外键引用的记录),但实际应用程序(合法地)失败。
我不清楚的是如何/在哪里执行必要的“PRAGMAforeign_keys = ON;” SQL 命令,以便它适用于我的 SQLite 单元/集成测试的任何连接,但不适用于我的主 SQL Server 连接。理想情况下,它似乎是 IDbConnectionFactory 注册的一部分。
有人可以帮忙吗?
编辑:级联删除将是处理这种情况的另一种方法,但是尽管使用ForeignKey属性在我的FK列上正确设置了这一点,但在与SQLite一起使用时,ServiceStack.OrmLite似乎并不遵守这一点(请注意此处),尽管后者支持为了它。这可能与最初的问题有关,默认情况下禁用 SQLite 的 FK 强制,如果首先启用它,它将正常工作。
我正在尝试使用子句Enumerable.Contains内部查询我的数据库SqlExpressionVisitor.Where.编译lambda时,我得到一个空引用异常.
当访问者进入foreach (Object e in inArgs)(当前行1067)内部时SqlExpressionVisitor.VisitArrayMethodCall,它会因为inArgs为空而窒息.以下是导致错误的示例.我不太了解lambda /表达式,知道为什么会发生这种情况.
所以我的问题是,我没有Where正确使用该条款或这是一个错误吗?
class Program
{
static void Main(string[] args)
{
var connectionFactory = new OrmLiteConnectionFactory(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|Database1.mdf;Integrated Security=True;User Instance=True", SqlServerDialect.Provider);
SetupDb(connectionFactory);
using (var db = connectionFactory.OpenDbConnection())
{
var numbersToSelect = new int[2] { 1, 2 };
db.Select<SomeObject>(e => e.Where(o => numbersToSelect.Contains(o.Number)));
}
}
static void SetupDb(IDbConnectionFactory connectionFactory)
{
using (var db = connectionFactory.OpenDbConnection())
{
db.DropTable<SomeObject>();
db.CreateTable<SomeObject>();
db.Insert(new SomeObject { Number = 1 …Run Code Online (Sandbox Code Playgroud) 有没有指定我想办法所有的的DateTime是OrmLite物化设置为UTC样S'
DateTime当插入一行时,我通过存储过程在我的数据库中存储了很多s:
insert [Comment] (
Body
, CreatedOn
) values (
@Body
, getutcdate()
);
Run Code Online (Sandbox Code Playgroud)
当我通过ormlite中的select语句检索值时,日期时间以Unspecified实物形式出现(我相信它被解释为本地时区):
var comments = db.SqlList<Comment>("select * from [Comment] where ... ");
Run Code Online (Sandbox Code Playgroud)
我宁愿不单独设置每个DateTime对象:
foreach (var comment in comments) {
comment.CreatedOn = DateTime.SpecifyKind(comment.CreatedOn, DateTimeKind.Utc);
}
Run Code Online (Sandbox Code Playgroud)
我发现了这个问题,但我认为这不是我要求的:
servicestack ormlite sqlite DateTime在插入时调整TimeZone
也找到了这个拉取请求,但设置SqlServerOrmLiteDialectProvider.EnsureUtc(true)似乎也没有.
我正在尝试使用 ServiceStack OrmLite 在事务内执行 sql。下面的代码适用于 Sqlite,但不适用于 SqlServer。使用 SqlServer 我收到以下错误:
当分配给命令的连接处于挂起的本地事务中时,ExecuteScalar 要求该命令具有事务。命令的 Transaction 属性尚未初始化。
这段代码有问题吗?
using (var trans = Db.BeginTransaction())
{
try
{
foreach (myObject in myObjects)
Db.Insert<MyObject>(myObject);
trans.Commit();
}
catch (Exception ex)
{
trans.Rollback();
throw ex;
}
}
Run Code Online (Sandbox Code Playgroud) 我想在ServiceStack OrmLite中进行一个简单的SQL连接,并将两个表作为相应的.NET对象.
在LINQ-to-Entities中,它将是这样的:
Claim.Join(Policy, c => c.PolicyId, p => p.Id, (c, p) => new { Claim = c, Policy = p })
Run Code Online (Sandbox Code Playgroud)
这会给我一个匿名类型Claim和Policy属性.
我查看了OrmLite 高级连接示例,但只选择了每种类型的一些属性为第3类对象(FullCustomerInfo).我不想在另一个对象中重复我的所有属性,我只想使用现有的对象.
实际上,查询可能要复杂得多,例如
Claim.Join(Policy, c => c.PolicyId, p => p.Id, (c, p) => new { Claim = c, Policy = p })
.Where(o => o.Policy.Something > o.Claim.Something)
.Select(o => o.Claim.SomethingElse)
Run Code Online (Sandbox Code Playgroud)
...等等,但即使OrmLite可以在SQL中进行连接,我也必须在内存中完成剩下的工作,这将是一个良好的开端.
继本评论之后,我如何进行连接两个或多个表的ServiceStack OrmLite查询并从每个表中返回一些列?
以OrmLite Does_only_populate_Select_fields_wildcard单元测试为例,我想做这样的事情:
public class DeptEmployee
{
[PrimaryKey]
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[References(typeof(Department2))]
public int DepartmentId { get; set; }
[Reference]
public Department2 Department { get; set; }
}
public class Department2
{
[PrimaryKey]
public int Id { get; set; }
public string Name { get; set; }
}
var q = db.From<DeptEmployee>()
.Join<Department2>()
.Select<DeptEmployee, Department2>((de, d2) => new[] …Run Code Online (Sandbox Code Playgroud) 我有以下架构:
class Order
{
public int OrderId { get; set; }
}
class LineItem
{
public int LineItemId { get; set; }
public int OrderId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我正在使用ServiceStack.OrmLite使用以下代码将Order与LineItem联接起来:
var query = db.From<Order>()
.LeftJoin<LineItem>()
.Where(o => o.OrderId == 1);
var results = db.SelectMulti<Order, LineItem>(query);
Run Code Online (Sandbox Code Playgroud)
SelectMulti()返回List<Tuple<Order, LineItem>>。当订单中没有订单项时,我将返回new LineItem()而不是null。
我希望能null回来,所以我可以说出“此订单不存在任何订单项”和“此订单包含具有默认值的订单项”之间的区别。
我可以检查订单项OrderId是否等于订单的OrderId,但理论上我可以将订单的订单号OrderId设为0,因此在这种情况下我将无法分辨。
是否有更好的方法与OrmLite保持连接?