我正在使用servicestack,我打算使用ormlite作为数据访问层.我有这些表(SQL Server 2005)
Table ITEM
ID PK
...
Table SUBITEM1
ID PK FK -> ITEM(ID)
...
Table SUBITEM2
ID PK FK -> ITEM(ID)
...
Table POST
ID PK
...
Table COMMENT
ID PK
...
Table DOWNLOAD
ID PK
...
Table POST_COMMENT
ID PK
POST_ID FK -> POST(ID)
COMMENT_ID FK -> COMMENT(ID)
Table DOWNLOAD_COMMENT
ID PK
DOWNLOAD_ID FK -> DOWNLOAD(ID)
COMMENT_ID FK -> COMMENT(ID)
Run Code Online (Sandbox Code Playgroud)
我为每个表创建了一个类,并使用注释(自动增量,引用等)映射它们.
我决定为每个"实体"(项目,帖子,评论,下载)创建一个存储库.每个存储库都包含基本的CRUD逻辑,
例如.1 CommentRepository有一个Save(注释,对象关系),它执行db.Insert(注释,关系),其中关系是PostComment或DownloadComment.
例如.2 PostRepository有一个Save(Post p)执行插入POST.
我不确定这个解决方案,因为存储库接口是不同的,我不能做多态查询.
你能提供任何建议来改善我的DAL吗?
感谢您的关注.
我在应用程序中使用OrmLite进行数据访问.在4个环境中的3个环境中,一切都按预期工作.
所有环境都在运行.net 4.5.数据库运行的版本不同.失败的环境是连接到sql server 10.50.2796,工作环境连接到sql server 10.50.4000.
System.Data*程序集的版本在无法正常工作的服务器上是相同的.
堆栈跟踪:
System.NullReferenceException:未将对象引用设置为对象的实例.位于服务堆栈的ServiceStack.OrmLite.ReadExtensions.ConvertToList [T](IDataReader dataReader)的lambda_method(Closure,Object,Object)中的C:\ src\ServiceStack.OrmLite\src\ServiceStack.OrmLite\Expressions\ReadExtensions.cs:第151行.OrmLite.ReadExtensions.Select [T](IDbCommand dbCmd,Expression
1 predicate) in C:\src\ServiceStack.OrmLite\src\ServiceStack.OrmLite\Expressions\ReadExtensions.cs:line 23 at ServiceStack.OrmLite.ReadConnectionExtensions.Exec[T](IDbConnection dbConn, Func2过滤器)在C:\ src\ServiceStack.OrmLite\src\ServiceStack.OrmLite\Expressions\ReadConnectionExtensions.cs:第26行
更新 我认为这是一个与我连接的sql server版本相关的错误.如果我在工作环境中更改连接字符串以使用运行10.50.2796的数据库,则会遇到相同的错误.
TIA,杰森
我想将ORMLite替换为EF5,请不要问我为什么:P ...所以我在网上搜索并且没有找到关于如何实际执行此操作的信息.
我是否需要改写ORMLiteConnectionFactory成EFConnectionFactory在的global.asax.cs注册?它实现起来似乎很多而且非常复杂,因为它IOrmLiteDialectProvider OrmLiteConfig与所有这些相关联,并且它似乎并不正确,因为SS通常对所有问题都有一个简单的答案.例如,如果我想将Funq更改为另一个DI提供程序,则相当容易.
ORMLite是武器的固定选择还是我可以调整的灵活选项?请帮忙.
有没有办法在ServiceStack.OrmLite中返回表的子集?
就像是:
public class MyStuff
{
public Guid Id { get; set; }
public string Name { get; set; }
public byte[] Data { get; set; } // Some large blob, which is not desired in the list
}
var somestuff = db.Select<MyStuff>(x => new { Id = x.Id, Name = x.Name });
Run Code Online (Sandbox Code Playgroud)
我真的希望避免手动的东西,比如"从某个地方选择blabla"......
我想从存储库而不是服务类访问数据库(为了增加分离 - 不确定这是否有点过分)即
public class TodoRepository // : BaseRepository derive the class and inject IDbConnection somehow?
{
public List<Todo> GetByIds(long[] ids)
{
return Db.Select<Todos>(t => Sql.In(t.id, ids)); <-- how to get 'Db' in here
}
}
Run Code Online (Sandbox Code Playgroud)
服务基类已经允许使用'Db'对象通过ormlite直接访问数据库,因此:
public class Service : IService, IRequiresRequestContext, IServiceBase, IResolver, IDisposable
{
public virtual IDbConnection Db { get; }
}
Run Code Online (Sandbox Code Playgroud)
让我相信我可以这样做,所以我可以在派生类中使用'Db':
public class BaseRepository: IDisposable
{
public virtual IDbConnection Db { get; }
}
Run Code Online (Sandbox Code Playgroud)
我的AppHost中有这一行来传递连接字符串并注册存储库:
container.Register<IDbConnectionFactory>(c => new OrmLiteConnectionFactory(connectionString, SqlServerDialect.Provider));
container.Register(new TodoRepository());
Run Code Online (Sandbox Code Playgroud)
如何将IDbConnection注入或自动装载到BaseRepository类?我已经尝试在AppHost中注册并自动装配BaseRepository而没有运气.
我在一个项目中使用ORMLite和Dapper,并希望标准化两个ORM使用的命名约定.为了做到这一点,我想将NamingStrategy设置为:
OrmLiteConfig.DialectProvider.NamingStrategy = new OrmLiteNamingStrategyBase();
Run Code Online (Sandbox Code Playgroud)
和单元测试验证
public class BorrowerUnitTests : IDisposable
{
private readonly ServiceStackHost appHost;
public BorrowerUnitTests()
{
//Set ORMLite to work with columns like ColumnLikeThis
// OrmLiteConfig.DialectProvider.NamingStrategy = new OrmLiteNamingStrategyBase();
appHost = new BasicAppHost(typeof(BorrowerServices).Assembly)
{
ConfigureContainer = container =>
{
container.Register<IDbConnectionFactory>(c =>
new OrmLiteConnectionFactory(ConfigUtils.GetConnectionString("LoanOrigination:Default"), PostgreSqlDialect.Provider));
container.RegisterAutoWiredAs<Repository, IRepository>();
container.RegisterAutoWired<BorrowerDomainService>();
}
}
.Init();
}
public void Dispose()
{
appHost.Dispose();
}
[Fact]
public void TestPostMethod()
{
var service = appHost.Container.Resolve<BorrowerServices>();
BorrowerCreate request = new BorrowerCreate();
request.FirstName = "Orm";
request.LastName = "Lite"; …Run Code Online (Sandbox Code Playgroud) 我一直在审查ServiceStack.OrmLite.SqlServer库,它工作得很好,但我们正在查看生成的SQL,我们想在我们的select语句中添加一个nolock提示但是找不到任何相关的文档?
当前:
exec sp_executesql N'SELECT "GroupID", "Name", "ShortName", "GroupTypeID", "ParentGroupId" FROM "Group" WHERE "GroupID" = @GroupID',
N'@GroupID int', @GroupID = 5543
Run Code Online (Sandbox Code Playgroud)
想:
exec sp_executesql N'SELECT "GroupID", "Name", "ShortName", "GroupTypeID", "ParentGroupId" FROM "Group" **WITH (NOLOCK)** WHERE "GroupID" = @GroupID',
N'@GroupID int', @GroupID = 5543
Run Code Online (Sandbox Code Playgroud)
有人知道怎么做吗?
是否可以使用ServiceStack联接2个以上的表?我尝试过类似的方法,但是我需要链接evrything:
// Join PatientDetails and BedDetails
SqlExpression<PatientDetails.PatientDetails> q = _dbConnection.From<PatientDetails.PatientDetails>();
q.Join<PatientDetails.PatientDetails, BedDetails.BedDetails>((patient, bed) => patient.ByBedId == bed.BedDetailsId);
List<PatientDetails.PatientDetails> PatientBedJOIN = _dbConnection.Select(q);
// Join PatientSession and PatientDetails
SqlExpression<PatientSession> q1 = _dbConnection.From<PatientSession>();
q1.Join<PatientSession, PatientDetails.PatientDetails>((session, patientd) => session.ByPatientId == patientd.PatientDetailsId);
List<PatientSession> SessionPatientJOIN = _dbConnection.Select(q1);
Run Code Online (Sandbox Code Playgroud)
我正在使用OrmLite和Sqlite,谢谢
我正在研究ServiceStack中的ORMLite,我在这里尝试的是调用一个存储过程,该存储过程又返回许多行,这些行肯定不会绑定到任何域对象,但也可能有或没有dto对象来映射用.我想知道我是否可以将它绑定到一个类型.但是,听起来ORMLite目前不支持动态类型绑定.ORMLite目前是否支持?
我可以将下面三个非常相似的功能合并到一个功能中吗?
所有这三个函数都会更新数据库中的特定列.update语句中的匿名对象用于更新相应的列.不应更改匿名对象中的成员名称,因为它是数据库中列的名称.
我正在使用ormlite-servicestack进行数据库连接.数据库我使用Microsoft SQLServer 2012.
//Updating the call status.
private void UpdateCallStatus(string claimId, bool isDisconnected)
{
_LogFactory.LogInfo(this.GetType(), "Updating call status....\n");
IDbConnectionFactory maConnectionFactory = new DatabaseConnection().getConnection();
using (var db = maConnectionFactory.Open())
{
db.Update<IVRSCallDetails>(new { IsDisconnected = isDisconnected }, where: callDetail => callDetail.ClaimId == claimId);
}
}
Run Code Online (Sandbox Code Playgroud)
//Updating the selected dtmf by the client using the claimid.
private void UpdateDtmf(string claimId, string selectedDtmf)
{
_LogFactory.LogInfo(this.GetType(), "Updating Selected DTMF:" + selectedDtmf + "\n");
IDbConnectionFactory maConnectionFactory = new DatabaseConnection().getConnection();
using (var db …Run Code Online (Sandbox Code Playgroud)