标签: castle-activerecord

什么是使用Castle Active Record和Straight NHibernate的利弊?

假设编写nhibernate映射文件不是一个大问题....或者使用属性污染域对象也不是一个大问题....

优缺点都有什么?

有什么基本的技术问题吗?什么往往会影响人们的选择?

不太清楚所有的权衡是什么.

c# nhibernate castle-activerecord

17
推荐指数
2
解决办法
4178
查看次数

关于如何从域(ORM)对象映射到数据传输对象(DTO)的建议

我正在使用的当前系统利用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)

c# orm castle-activerecord dto-mapping

13
推荐指数
1
解决办法
3076
查看次数

Nhibernate HQL在哪里IN查询

我试图返回一个查询单个表并使用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工作.我找不到任何涉及此文件的文件,并希望有人能够提供帮助.

谢谢

nhibernate castle-activerecord hql

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

如何使用Castle ActiveRecord执行存储过程?

我相信在网上的某个地方有关于这个话题的讨论,但我丢失了网址,我无法通过谷歌搜索找到它.

我现在可能会尝试的是:

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)

但是,我不太确定这是否是正确的方法,或者是否存在更好的方法.

.net c# stored-procedures castle-activerecord

8
推荐指数
1
解决办法
4068
查看次数

带有命名参数的nhibernate hql

我使用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)

nhibernate castle-activerecord hql

8
推荐指数
1
解决办法
8819
查看次数

什么是NHibernate会话?

很长一段时间我通过像Castle ActiveRecord这样的框架使用NHibernate会话,但是从来没有完全理解什么是会话以及应该如何操作.有人可以帮忙吗?有没有简洁的资源?

提前致谢

nhibernate session activerecord castle castle-activerecord

8
推荐指数
1
解决办法
9816
查看次数

带有类自动生成的.NET ORM解决方案:Subsonic,Castle AR,......?

我曾经使用自定义数据映射库,并且我正在尝试切换到更广泛的ORM解决方案.

经过一些实验,我将我的要求提炼到以下几点:

  • 能够从数据库模式生成可用的类(SQL Server支持就足够了),
  • 支持ActiveRecord模式,
  • programmaticaly可配置(通过代码或属性,没有HBM文件),
  • 自由.

你能推荐一个吗?


到目前为止,我尝试过:

亚音速3.0

我最喜欢的那个,因为它感觉就像功能和简单之间的良好平衡.

我不喜欢的:

  • 使用IQueryable <>和复数名称用于一对多关系的两端 - 这对我来说似乎是违反直觉的;
  • 为所有类生成一个文件 - 就像每个类一千行一样,我对代码文件那么大感觉不好;
  • T4处理是自动调用的,因此具有最新模式的数据库必须始终可用.

城堡ActiveRecord

带有ActiveWriter加载项的CastleAR几乎就是我所需要的,但是ActiveWriter的代码并不完美(似乎不支持Nullable <>属性,默认的一对多实现不起作用)我找不到如何手动修复此代码.

Darkside GeneratorStudio产生更好的代码 - 正确的定义,每个实体一个文件 - 尽管它使用神秘的名称,如RefclassIdRefclass.我个人喜欢Studio addin而不是独立应用,但这肯定是一个小问题.

CastleAR发行版中捆绑了大约20个文件; 虽然本身不​​是问题,但感觉就像超重.我不需要太多关于NHibernate和其他东西的深奥知识吗?

流利的NHibernate

广泛推荐,但我无法找到它的代码生成器.

我错过了重要的事吗?

.net subsonic nhibernate orm castle-activerecord

7
推荐指数
1
解决办法
1701
查看次数

建议使用Castle ActiveRecord插入许多行并忽略任何欺骗行

我有一个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异常.解决这个问题的最佳方法是什么,只需忽略重复的行.我目前的想法是:

  • 1)首先从数据库加载用户的整个队列,然后首先检查该列表.如果配方已存在,则只需continue在for循环中.优点:没有不必要的SQL插入发送到数据库.缺点:较慢,特别是如果用户有一个大队列.
  • 2)不要使用ActiveRecord,而是将整个recipeIds数组传递给SQL函数.此函数将检查每行是否首先存在.优点:潜在的速度,让SQL处理所有肮脏的工作.缺点:打破ActiveRecord模式并需要新的DB代码,这通常难以维护并且实现起来更昂贵.
  • 3)每次循环后CreateAndFlush.基本上,不要在单个事务中运行整个循环.在添加时提交每一行并捕获SQL错误并忽略.优点:启动成本低,不需要新的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)

c# sql postgresql nhibernate castle-activerecord

7
推荐指数
1
解决办法
713
查看次数

如何在请求子类时停止Automapper映射到父类

我正在努力在我们的服务中实现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)

c# castle-activerecord automapper automapper-4

7
推荐指数
1
解决办法
515
查看次数

具有相同标识符的不同对象已与会话错误相关联

场景:我有一个启用了延迟加载的客户对象.我在整个程序中使用它来调用列表框的客户列表.它与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)

c# nhibernate join castle-activerecord linq-to-nhibernate

6
推荐指数
1
解决办法
2895
查看次数