对于具有标识的表:
[AutoIncrement]
public int Id { get; set;}
Run Code Online (Sandbox Code Playgroud)
将新行插入数据库时,检索对象Id的最佳方法是什么?
例如:
db.Insert <>(new User());
插入后Id的值为0,但在数据库中显然不是这种情况.我能看到的唯一可能性如下:
Id = (int)db.GetLastInsertId();
Run Code Online (Sandbox Code Playgroud)
但是我不相信这是一个安全的号召.如果同时发生100个插入,则可能会返回另一个插入的Id.在EF中进行插入时,将为您设置ID.
有谁知道最好的方法吗?
我刚刚学会了一种天才类型,它可以简化我的大部分工作,但看起来我的首选ORM无法识别它.
是否有一种解决方法让ServiceStack OrmLite HierarchyId在SQL Server中识别?有关要修改哪些文件的任何建议以及任何提示如何继续?
编辑:
这是对问题的更好说明.我有以下课程:
public class MyClass
{
public int Id { get; set; }
public SqlHierarchyId HierarchyId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
SqlHierarchyId是一种自定义SQL Server数据类型.OrmLite将为它生成以下类:

有趣的是,我可以使用[StringLength(255)]属性上的属性,它将获得varchar(255)类型:

我在这里手动更改了表,并添加了列数据类型来展示差异.请注意第三列的数据类型:

具有varchar表示与其他DBMS完全一样,因为它可以在C#中转换,但是对于SQL Server,最好使它与相应的数据类型匹配.这将使视图的创建更容易(由于hierarchyid数据类型的内置函数).
我知道EF4不支持这种类型(不确定5).我还浏览了GitHub上的OrmLiteDialectProviderBase.cs文件,我可以看到支持的ADO.NET数据类型列表.
我的简单问题是:这是ADO.NET的一个强大限制,还是在OrmLite中可以看到这个?如果提出任何建议,我愿意帮助扩展这一部分.
我正在围绕servicestack框架构建一个应用程序,并且需要能够访问Oracle和MS Sql Server中的数据.这可能是使用ORMLite,似乎我只能为App设置一个方言或者我错过了什么?
任何人都知道如何应用正确的Alias属性来查询具有模式名称的表?
我有一张叫做的桌子accounts.register.我已经尝试使用[Alias("accounts.register")]Register类的类装饰器属性,但这不起作用.
如果我将模式更改为dbo然后我可以删除别名,一切正常.不幸的是,我有一个遗留系统有很多模式,所以我需要这个工作.
这是实体框架:
var department = _context.Departments
.Include(dep => dep.Employees.Select(emp => emp.ContactTypes))
.SingleOrDefault(d => d.Id == departmentId);
Run Code Online (Sandbox Code Playgroud)
在这里,我希望返回一个部门,其中包含所有相关员工以及每个员工的所有联系类型.
这是ormlite servicestack:
我不知道.当我查看docu/samples时:https://github.com/ServiceStack/ServiceStack.OrmLite
他们写:
现在,Expression支持可以使用强类型API来满足大多数简单查询.对于任何更复杂的事情(例如,使用表连接的查询),您仍然可以轻松地回退到原始SQL查询,如下所示.
我已经看到有一个JoinSqlBuilder类,但我不认为它可以返回嵌套集合.
也许我想要的是不可能的,但也许我可以做一个妥协,比如让所有员工都参加部门会议.然后我记忆员工并获取某个employeeId的所有联系人类型.创建层次结构并分配列表仍然是我的工作.
但我希望有一个更短的解决方案.
什么也没关系,当查询但它可能看起来像返回一个具有3个平面属性的对象(动态?):Department,Employees,ContactTypes并为我的DTO分配thoese属性.
假设有两个存储库接口:
interface IFooRepository
{
void Delete(int id);
}
interface IBarRepository
{
void Delete(int id);
}
Run Code Online (Sandbox Code Playgroud)
和IUnitOfWork接口类似:
interface IUnitOfWork : IDisposable
{
void Commit();
void Rollback();
}
Run Code Online (Sandbox Code Playgroud)
使用ServiceStack.ORMLite实现这些接口的最佳实践是什么,以便用户可以像使用它们一样使用它们
MyFooRepository.Delete(4);
// if an Exception throws here, Bar won't be deleted
MyBarRepository.Delete(7);
Run Code Online (Sandbox Code Playgroud)
要么
using (var uow = CreateUnitOfWork())
{
MyFooRepository.Delete(4);
MyBarRepository.Delete(7);
uow.Commit(); //now they are in an transaction
}
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种在ormlite中实现分页的好方法,我发现了另一个问题,其中包含以下代码:
var data = db.Select<address>(predicate).Skip((int) pageNumber).Take((int) pageSize).ToList();
上面的问题是它返回所有结果,然后跳过并接受它,这违背了分页的目的.
在另一个google群组帖子中,我发现了同样的问题,并且github问题中的一个示例被提及作为解决方案,但URL不再有效.有谁知道如何使用servicestack正确页面?
我喜欢SS但我正在试图对我的业务层进行单元测试.我是单位测试和模拟的新手,并且正在阅读NSubstitute,因为这看起来像一个有趣的模拟层.
我的文件结构大致如下:
MainAppHostProject*
|
-AppStart
-AppHost <-- standard apphost
DtoProject*
|
-HelloWorldDto <-- simple POCO to
ServiceLayerProject*
|
-HelloWorldService <-- service interface that merely passes/sends Dtos to/from business layer
BusinessLayerProject*
|
-HelloWorldManager <-- logic to construct response and this class extends 'Service' (letting me access Db, session, etc)...sidenote: maybe i shouldve called this a HelloWorldRepository?
-CustomAuthProvider
-CustomUserSession
DaoProject*
|
-HelloWorldDao <-- POCO of table structure
Run Code Online (Sandbox Code Playgroud)
Apphost指向HelloWorldService程序集并将SQL Server数据库注册为标准数据库.
一切都很有效,我已经能够以更清洁的方式构建逻辑.不幸的是我想开始进行单元测试,但我不知道如何解耦数据库.
我试图在内存数据库中注册一个假的,但后来我认为我在SQL Server和SQLite方式中使用代码来获取身份等方面存在不兼容问题.
// container.Register<IDbConnectionFactory>(c => new OrmLiteConnectionFactory(":memory:", false, SqliteOrmLiteDialectProvider.Instance));
// container.Register<IDbConnectionFactory>(c => …Run Code Online (Sandbox Code Playgroud) 目前,我正在使用OrmLite进行数据库操作.我也打算使用Dapper ORM,但任何人都可以指出我如何在ServiceStack中集成DapperORM.我是否需要将Dapper和插件的IDbConnection和IDbConnectionFactory接口实现到容器中.
public override void Configure(Container container) {
container.Register<IDbConnectionFactory>(
c => new OrmLiteConnectionFactory(ConfigurationManager.ConnectionStrings["default"].ConnectionString,
SqlServerDialect.Provider));
container.Register<IDbConnection>(c => c.Resolve<IDbConnectionFactory>().OpenDbConnection()).ReusedWithin(ReuseScope.Request);
}
Run Code Online (Sandbox Code Playgroud) 如何在表中创建列并在使用servicestack ormlite时将其指定为varchar(max)?
目前我在创建表后执行一些sql以获得我想要的东西.我已经看过StringLength属性,但想知道是否有更好的方法呢?
就像是
StringLength(Sql.VarcharMax)
Run Code Online (Sandbox Code Playgroud)
谢谢