标签: ormlite-servicestack

使用 SQLite 时如何让 ServiceStack.OrmLite 强制执行外键?

根据另一个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 强制,如果首先启用它,它将正常工作。

sqlite servicestack ormlite-servicestack

5
推荐指数
0
解决办法
473
查看次数

Ormlite Where-Contains失败

我正在尝试使用子句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-servicestack

5
推荐指数
2
解决办法
1586
查看次数

ServiceStack OrmLite 和事务

我正在尝试使用 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)

sql-server transactions ormlite-servicestack

5
推荐指数
1
解决办法
3023
查看次数

使用 ServiceStack / OrmLite 在 SQL Server 中持久化 Nodatime Instant

我在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. 我是否需要告诉 …

c# sql-server servicestack nodatime ormlite-servicestack

5
推荐指数
1
解决办法
934
查看次数

与ServiceStack Orm lite相比,Entity Framework 5的性能

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

4
推荐指数
1
解决办法
1万
查看次数

ServiceStack对视图的ORMLite支持

我在这里阅读了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)

c# servicestack ormlite-servicestack

4
推荐指数
1
解决办法
1383
查看次数

我应该将哪个ORM与ServiceStack和现有数据库一起使用

我目前正在开发一个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

4
推荐指数
1
解决办法
4782
查看次数

PredicateBuilder嵌套OR子句,导致大型谓词的嵌套问题太深

简介:我将PredicateBuilderOr()几个表达式一起使用,然后将该组合表达式发送到OrmLiteSelect()方法.但是,生成的SQL有一个WHERE带有如此多嵌套括号的子句,SQL Server会抛出错误.我该怎么做才能解决这个问题?

细节:我有一个Foo有两列的表,BarBaz.如果我有一组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)

c# predicatebuilder ormlite-servicestack

4
推荐指数
1
解决办法
1075
查看次数

ServiceStack OrmLite,阅读所有记录

刚刚第一次尝试OrmLite,并且已经通过示例/文档查看了20分钟,现在没有运气试图找到一个简单的答案.

有没有办法只返回某种类型的所有记录?(返回的东西可能是列表或其他东西.

我以为会有一个

db.SelectAll<T>();
Run Code Online (Sandbox Code Playgroud)

相似的东西.

我确定除了发送查询之外还有一种非常简单的方法吗?

SELECT * FROM [TableName]
Run Code Online (Sandbox Code Playgroud)

我敢肯定我只是忽略了其中一种方法,或者没有找到正确的超载......但如果有人能给我一个推动,那将是美妙的.

servicestack ormlite-servicestack

4
推荐指数
1
解决办法
909
查看次数

OrmLite Update()vs Save()

使用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并且难以跟踪错误时,不会抛出异常并且没有问题的迹象.

c# sql-server-2012 ormlite-servicestack

4
推荐指数
1
解决办法
3705
查看次数