假设编写nhibernate映射文件不是一个大问题....或者使用属性污染域对象也不是一个大问题....
优缺点都有什么?
有什么基本的技术问题吗?什么往往会影响人们的选择?
不太清楚所有的权衡是什么.
我正在使用的当前系统利用Castle Activerecord在Domain对象和数据库之间提供ORM(对象关系映射).这一切都很好,在大多数情况下实际上运作良好!
问题出在Castle Activerecords支持异步执行,更具体地说是管理对象所属会话的SessionScope.长话短说,坏事发生了!
因此,我们正在寻找一种方法来轻松转换(自动思考)从Domain对象(谁知道数据库存在和关心)到DTO对象(谁对DB一无所知,不关心会话,映射属性或所有事物) ORM).
有没有人有这样做的建议.首先,我正在寻找对象的基本一对一映射.域对象Person将被映射为PersonDTO.我不想手动这样做,因为它是浪费.
很明显,人们会想到反思,但我希望在这个网站周围有一些更好的IT知识 可以提出"更酷".
哦,我正在使用C#,ORM对象在使用Castle ActiveRecord映射之前说过.
通过@ ajmastrean的请求,我已经链接到一个我(非常)嘲弄在一起的例子.该示例具有捕获表单,捕获表单控制器,域对象,activerecord 存储库和异步帮助程序.它有点大(3MB),因为我包含了运行它所需的ActiveRecored dll.您需要在本地计算机上创建一个名为ActiveRecordAsync的数据库,或者只需更改.config文件.
示例的基本细节:
捕获表格
捕获表单引用了控制器
private CompanyCaptureController MyController { get; set; }
Run Code Online (Sandbox Code Playgroud)
在表单的初始化时,它调用MyController.Load()private void InitForm(){MyController = new CompanyCaptureController(this); MyController.Load(); 这将返回一个名为LoadComplete()的方法
public void LoadCompleted (Company loadCompany)
{
_context.Post(delegate
{
CurrentItem = loadCompany;
bindingSource.DataSource = CurrentItem;
bindingSource.ResetCurrentItem();
//TOTO: This line will thow the exception since the session scope used …
Run Code Online (Sandbox Code Playgroud) 我试图返回一个查询单个表并使用IN的SimpleQuery列表.我可以使用它来工作
return new List<Jobs>(
ActiveRecordMediator<Jobs>.FindAll(Expression.In("ServiceId", ids))
);
Run Code Online (Sandbox Code Playgroud)
然而,这真的非常慢.所以我喜欢做这样的事情
SimpleQuery<Job> query =
new SimpleQuery<Job>(@"from Job as j where ? in (j.ServiceId)", ids);
return new List<Job>(query.Execute());
Run Code Online (Sandbox Code Playgroud)
但是我无法使SimpleQuery工作.我找不到任何涉及此文件的文件,并希望有人能够提供帮助.
谢谢
我相信在网上的某个地方有关于这个话题的讨论,但我丢失了网址,我无法通过谷歌搜索找到它.
我现在可能会尝试的是:
ISessionFactoryHolder factoryHolder = ActiveRecordMediator<EntityClass>.GetSessionFactoryHolder();
ISession session = factoryHolder.CreateSession(typeof(EntityClass));
try
{
IDbCommand cmd = session.Connection.CreateCommand();
cmd.CommandText = "spName";
cmd.ExecuteNonQuery();
}
catch(Exception ex)
{
}
finally
{
factoryHolder.ReleaseSession(session);
}
Run Code Online (Sandbox Code Playgroud)
但是,我不太确定这是否是正确的方法,或者是否存在更好的方法.
我使用Castel Active Record实现了搜索功能.我认为代码很简单,但我一直在努力
NHibernate.QueryParameterException:无法找到命名参数[searchKeyWords]
错误.谁能告诉我出了什么问题?太感谢了.
public List<Seller> GetSellersWithEmail(string searchKeyWords)
{
if (string.IsNullOrEmpty(searchKeyWords))
{
return new List<Seller>();
}
string hql = @"select distinct s
from Seller s
where s.Deleted = false
and ( s.Email like '%:searchKeyWords%')";
SimpleQuery<Seller> q = new SimpleQuery<Seller>(hql);
q.SetParameter("searchKeyWords", searchKeyWords);
return q.Execute().ToList();
}
Run Code Online (Sandbox Code Playgroud) 很长一段时间我通过像Castle ActiveRecord这样的框架使用NHibernate会话,但是从来没有完全理解什么是会话以及应该如何操作.有人可以帮忙吗?有没有简洁的资源?
提前致谢
我曾经使用自定义数据映射库,并且我正在尝试切换到更广泛的ORM解决方案.
经过一些实验,我将我的要求提炼到以下几点:
你能推荐一个吗?
到目前为止,我尝试过:
亚音速3.0
我最喜欢的那个,因为它感觉就像功能和简单之间的良好平衡.
我不喜欢的:
城堡ActiveRecord
带有ActiveWriter加载项的CastleAR几乎就是我所需要的,但是ActiveWriter的代码并不完美(似乎不支持Nullable <>属性,默认的一对多实现不起作用)我找不到如何手动修复此代码.
Darkside GeneratorStudio产生更好的代码 - 正确的定义,每个实体一个文件 - 尽管它使用神秘的名称,如RefclassIdRefclass.我个人喜欢Studio addin而不是独立应用,但这肯定是一个小问题.
CastleAR发行版中捆绑了大约20个文件; 虽然本身不是问题,但感觉就像超重.我不需要太多关于NHibernate和其他东西的深奥知识吗?
流利的NHibernate
广泛推荐,但我无法找到它的代码生成器.
我错过了重要的事吗?
我有一个webmethod,它将一堆食谱插入到数据库的队列中(以存储用户有兴趣烹饪的食谱,类似于NetFlix的电影队列).用户可以立即检查一堆食谱并排队.我有类似这样的代码:
[WebMethod]
public void EnqueueRecipes(SecurityCredentials credentials, Guid[] recipeIds)
{
DB.User user = new DB.User(credentials);
using (new TransactionScope(OnDispose.Commit))
{
foreach (Guid rid in recipeIds)
{
DB.QueuedRecipe qr = new DB.QueuedRecipe(Guid.NewGuid(), user, new DB.Recipe(rid));
qr.Create();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我对UserId/RecipeId有一个独特的约束,因此用户只能将配方排队一次.但是,如果他们碰巧选择了已经在队列中的配方,我真的不想用错误消息打扰用户,我只想忽略该配方.
如果违反了唯一约束,上面的代码将抛出SQL异常.解决这个问题的最佳方法是什么,只需忽略重复的行.我目前的想法是:
continue
在for循环中.优点:没有不必要的SQL插入发送到数据库.缺点:较慢,特别是如果用户有一个大队列.还有Castle或NHibernate框架的其他小技巧吗?另外,我的SQL后端是PostgreSQL 9.0.谢谢!
更新:
我采取了第一种方法,它看起来效果很好.它发生在我身上我不必加载整个队列,只需加载出来在recipeIds中的队列.我相信我的foreach()
循环现在是O(n ^ 2)取决于效率,List<Guid>::Contains()
但我认为这对于我将使用的尺寸可能是不错的.
//Check for dupes
DB.QueuedRecipe[] dbRecipes = DB.QueuedRecipe.FindAll(Expression.In("Recipe",
(from r in recipeIds select new DB.Recipe(r)).ToArray()
));
List<Guid> existing = (from r in dbRecipes select r.Recipe.RecipeId).ToList();
using (new TransactionScope(OnDispose.Commit)) …
Run Code Online (Sandbox Code Playgroud) 我正在努力在我们的服务中实现AutoMapper,并且在我们的单元测试中看到了一个非常令人困惑的问题.
首先,此问题涉及以下对象及其各自的映射:
public class DbAccount : ActiveRecordBase<DbAccount>
{
// this is the ORM entity
}
public class Account
{
// this is the primary full valued Dto
}
public class LazyAccount : Account
{
// this class as it is named doesn't load the majority of the properties of account
}
Mapper.CreateMap<DbAccount,Account>();
//There are lots of custom mappings, but I don't believe they are relevant
Mapper.CreateMap<DbAccount,LazyAccount>();
//All non matched properties are ignored
Run Code Online (Sandbox Code Playgroud)
它也涉及这些对象,但此时我还没有使用AutoMapper映射这些对象:
public class DbParty : ActiveRecordBase<DbParty>
{
public …
Run Code Online (Sandbox Code Playgroud) 场景:我有一个启用了延迟加载的客户对象.我在整个程序中使用它来调用列表框的客户列表.它与Division_Customer_Rel,Division_Email_Rel和Email_Address对象有关系.所有关系都有Lazy = true, Cascade = ManyRelationCascadeEnum.AllDeleteOrphan, Inverse = true
.
问题:当我使用新会话并尝试保存时,会给我错误A different object with same identifier was already associated with the session
.我试图通过加入调用中的其他对象来使用LINQ返回列表而不使用新会话,但我不确定如何在加入时使用ActiveRecordLinq <>.
private Customer GetCustomer()
{
return (from x in ActiveRecordLinq.AsQueryable<Customer>()
where x.Customer_ID == ((Customer)lst_customers.SelectedItem).Customer_ID
select x).First();
}
Run Code Online (Sandbox Code Playgroud)
产生错误的代码
using (new SessionScope())
{
//var sess = GetSession();
//var customer =
// sess.CreateCriteria<Customer>("c").CreateCriteria("c.DivisionCustomer_Rels").List<Customer>().
// First();
var customer = GetCustomer();
/* Ensure user wishes to commit the data. */
var result =
MessageBox.Show(
@"You are about …
Run Code Online (Sandbox Code Playgroud) nhibernate ×7
c# ×6
.net ×2
hql ×2
orm ×2
activerecord ×1
automapper ×1
automapper-4 ×1
castle ×1
dto-mapping ×1
join ×1
postgresql ×1
session ×1
sql ×1
subsonic ×1