根据另一个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) 我正在尝试使用 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) 我在InstantServiceStack 的 DTO 中使用 NodaTime进行日期/时间存储。我已将 DTO 中的 SQL 类型指定为datetimeoffset,ServiceStack 正确创建了具有该类型的表。但是,在保存时,我得到一个InvalidCastException.
简单的例子:
public class ItemWithInstant
{
public int Id { get; set; }
public string Name { get; set; }
[CustomField("DateTimeOffset")
public Instant DateCreated { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在服务中:
public object Post(CreateItemWithInstant request)
{
var dto = request.ConvertTo<ItemWithInstant>();
Db.Save(dto); // ERROR here
return dto;
}
Run Code Online (Sandbox Code Playgroud)
具体的错误是一个InvalidCastException带有Failed to convert parameter value from an Instant to a String 的详细信息。
不知道为什么当数据库类型为DateTimeOffset. 我是否需要告诉 …
EF5在一周前发布,应该会有相当多的性能提升.我目前正在使用ServiceStack OrmLite,但我正在考虑转换到EF5,因为它还允许CodeFirst +它具有迁移功能.
然而,我发现的基准看起来并不是很好
http://www.servicestack.net/benchmarks/取自http://code.google.com/p/dapper-dot-net
但据我所知,他们没有更新以测试最新版本的EF5.有没有人知道EF5与OrmLite和Dapper的一些新的更新基准?
我也在考虑留在OrmLite,然后使用Fluentmigrator http://www.github.com/schambers/fluentmigrator进行迁移,而不是启用迁移的新EF5.
切换到EF5的原因,在Visual Studio和MVCScaffolding中有很多内置支持,"它更标准",因此更容易招募+外包代码的人.
但是我再次非常喜欢整个ServiceStack堆栈,包括OrmLite,我觉得它非常精心制作,虽然我自己没有做过任何系统的性能测试.
因此,我要求提供有关从ServiceStack Ormlite + Fluentmigrations切换到EF5 +以及将EF5与OrmLite进行比较的任何更新基准的建议和论据.
entity-framework fluent-migrator servicestack dapper ormlite-servicestack
我在这里阅读了mythz的帖子,关于ORMLite如何从SQL读取任何内容并将其装入相同形状的POCO中.那样太好了.
另一方面,ORMLite在将它们保存回数据库时如何处理这些"View POCO"?由于它们不是表,它们可能是视图,也可能只是任何sql select查询:
var rows = dbCmd.Select<ShipperTypeCount>(
"SELECT ShipperTypeId, COUNT(*) AS Total FROM Shippers GROUP BY ShipperTypeId ORDER BY COUNT(*)");
Run Code Online (Sandbox Code Playgroud) 我目前正在开发一个Web服务,它提供对业务对象的基本CRUD操作.该服务将由当前使用直接数据库访问的遗留应用程序使用.
由于ServiceStacks的优秀架构,我决定使用ServiceStack而不是WCF.
但是知道我正在尝试使用OrmLite,nHibernate或Entity Framework来访问现有的遗留数据库.
ORM的要求如下
我已经尝试过OrmLite(因为它很快并且已经包含在ServiceStack中).我设法加入两个表的唯一方法是使用SQL(不是一个选项).有没有更好的方法?
// @stackoverflow: This is my POCO DTO
public class Country
{
public long Id { get; set; }
public string Alpha2 { get; set; }
public string Alpha3 { get; set; }
public string ShortText { get; set; }
public string LongText { get; set; }
}
public class CountryRepository : ICountryRepository
{
// @stackoverflow: This is the query to join countries with translated names stored in another table
private const string …Run Code Online (Sandbox Code Playgroud) c# nhibernate entity-framework servicestack ormlite-servicestack
简介:我将PredicateBuilder与Or()几个表达式一起使用,然后将该组合表达式发送到OrmLite的Select()方法.但是,生成的SQL有一个WHERE带有如此多嵌套括号的子句,SQL Server会抛出错误.我该怎么做才能解决这个问题?
细节:我有一个Foo有两列的表,Bar和Baz.如果我有一组Bar/Baz值并且我想找到所有匹配的行,那么我可能(例如)发出以下SQL:
SELECT * FROM Foo WHERE (Bar=1 AND Baz=1) OR (Bar=2 AND Baz=3) OR ...
Run Code Online (Sandbox Code Playgroud)
由于我正在使用OrmLite,我正在使用PredicateBuilder为我生成where子句:
var predicate = PredicateBuilder.False<Foo>();
foreach (var nextFoo in fooList)
predicate = predicate.Or(foo => nextFoo.Bar == foo.Bar &&
nextFoo.Baz == foo.Baz);
Db.Select(predicate);
Run Code Online (Sandbox Code Playgroud)
如果我在列表中使用3个Foos执行此操作,则生成的SQL看起来像这样(为了简洁而清理,但故意留在一行上以表达观点):
SELECT Bar, Baz FROM Foo WHERE ((((1=0) OR ((1=Bar) AND (1=Baz))) OR ((2=Bar) AND …Run Code Online (Sandbox Code Playgroud) 刚刚第一次尝试OrmLite,并且已经通过示例/文档查看了20分钟,现在没有运气试图找到一个简单的答案.
有没有办法只返回某种类型的所有记录?(返回的东西可能是列表或其他东西.
我以为会有一个
db.SelectAll<T>();
Run Code Online (Sandbox Code Playgroud)
相似的东西.
我确定除了发送查询之外还有一种非常简单的方法吗?
SELECT * FROM [TableName]
Run Code Online (Sandbox Code Playgroud)
我敢肯定我只是忽略了其中一种方法,或者没有找到正确的超载......但如果有人能给我一个推动,那将是美妙的.
使用OrmLite将条目添加到数据库时,似乎有两种方法:
dbConn.Insert(customer);
Run Code Online (Sandbox Code Playgroud)
和
dbConn.Save(customer);
Run Code Online (Sandbox Code Playgroud)
使用Insert()时,AutoIncrement ID字段不会更新,但是当使用Save()时它会更新.
如果您使用:
dbConn.LastInsertId();
Run Code Online (Sandbox Code Playgroud)
如果使用Save(),它将返回正确的ID,但如果使用Insert(),则返回错误的ID.
为什么存在这两种方法?使用Insert()将使用正确的ID向数据库添加条目,它不会反映在POCO模型中.看起来很奇怪,如果您不知道这一点,那么当您最终使用错误的ID并且难以跟踪错误时,不会抛出异常并且没有问题的迹象.
servicestack ×7
c# ×5
sql-server ×2
dapper ×1
nhibernate ×1
nodatime ×1
sqlite ×1
transactions ×1