Tag: nhibernate

具有Nhibernate设计问题的域模型

我正试图开始使用“DDD with C#”世界。 我使用NHibernate作为我的ORM工具,因此尝试开发PI(Persistence Ignorance)模型。 但是,在我的一些实体(表示为POCOS)中,我在我的属性的setter中有业务规则。 例如,我有一个“User”实体,它有一个标志,指示此用户是否被阻止,当此标志为true时,必须自动填充当前日期的第二个字段“Block Date”。 一切看起来都非常清晰和简单,但问题出现在我恢复已经持久存储在数据库中的用户,即使被阻止的用户将其“阻止日期”更新到当前日期,根据这个逻辑。 最初我想到了第二个标志“isLoaded”,它表明NHibernate正在对象进行水合,然后这个逻辑不会被启动,但这看起来不像PI。 有关如何改善这一点的任何建议?

如何使用FluentNHibernate映射具有复杂键类型(CultureInfo)的字典

我有字典,我正在使用Fluent NHibernate进行映射。 该词典具有复杂的键类型CultureInfo 。 我的数据库无法存储该类型,因此我想使用它的字符串表示forms。 在字典映射以外的映射中,我可以使用用户类型约定成功映射CultureInfo -properties。 现在我想知道如何为dicationary映射做这件事。 这是包含字典的实体: public class MultilingualPhrase : Entity { private IDictionary languageValues; public virtual IDictionary LanguageValues { get { return languageValues; } } } 这是实体的自动映射覆盖: public void Override(AutoMapping mapping) { mapping .HasMany(n => n.LanguageValues) .Access.ReadOnlyPropertyThroughCamelCaseField() .AsMap(“CultureName”) .Element(“Phrase”) .Table(“MultilingualPhraseValues”); } 此映射(显然)会导致以下错误: 无法将CultureInfo中的参数值转换为String。 我知道NHibernate有一个CultureInfo的类型自定义类型实现(我用它来映射属性)但是如何在我的映射覆盖中指定它?

Nhibernate:以相同的精度和比例映射所有小数

我理解在NHibernate中,使用代码映射,我可以指定十进制属性的精度和比例,如下所示: Property( x => x.Dollars, m => { m.Precision(9); m.Scale(6); } ); 这很好,但我想知道是否有一种方法可以轻松地以简单的方式映射所有类中的所有小数属性。 我必须仔细检查所有映射并手动更新每个映射,这似乎有点疯狂。 有谁知道如何实现这一目标?

在NHIbernate中使用带有公式的属性映射

我试图将属性映射到另一个表的任意列。 文档说公式可以是任意SQL,我看到的例子显示相似。 但是,SQL NHibernate生成的甚至不是有效的。 公式中的整个SQL语句被注入SELECT语句的中间。 Property(x => x.Content, map => { map.Column(“Content”); map.Formula(“select ‘simple stuff’ as ‘Content'”); });

在使用Fluent Nhibernate Table-Per-Subclass策略时,您能指定标识列吗?

我正在创建一个Fluent N hibernate子类映射,目前看起来像这样: public class TaskDownloadMap: SubclassMap { public TaskDownloadMap() { Table(“TasksDownload”); Map(x => x.ExtraProperty1, “ExtraProperty1”) .Nullable(); Map(x => x.ExtraProperty2, “ExtraProperty2”) .Nullable(); } } 当我尝试保存其中一个实体时,我得到一个例外: Test.TaskRepositoryTest.DeleteTest: NHibernate.Exceptions.GenericADOException : could not insert: [TaskManager.Entities.TaskDownload#269][SQL: INSERT INTO TasksDownload (ExtraProperty1, ExtraProperty2, Task_id) VALUES (?, ?, ?)] —-> System.Data.SqlClient.SqlException : Invalid column name ‘Task_id’. 这是因为我在子类的表上设置的Id列被命名为“TaskId”。 是否有一些覆盖nhibernate试图使用的默认命名方案? 我似乎没有能力在子类中指定“Id”列,我甚至无法找到其他任何人谈论它。 父映射如下所示: public class […]

使用表达式在NHibernate QueryOver中进行动态排序

给出以下QueryOver : UserProfile userProfileAlias = null; Pegfile pegfileAlias = null; var q = Session.QueryOver(() => pegfileAlias) .JoinAlias(() => pegfileAlias.UserProfile, () => userProfileAlias); 我想通过交换使以下语句动态化 q = q.OrderBy(() => userProfileAlias.Forename).Asc; (OrderBy(Expression<Func>或( OrderBy(Expression<Func>) ) 同 q = q.OrderBy(GetMemberExpression(userProfileAlias, “Forename”)).Asc; 我借了另一篇文章来获取 private Expression<Func> GetMemberExpression(UserProfile instance, string propertyName) { var arg = Expression.Constant(instance, typeof(UserProfile)); var body = Expression.Convert(Expression.PropertyOrField(arg, propertyName), typeof(UserProfile)); […]

建议使用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(); } } } 我对UserId / RecipeId有一个独特的约束,因此用户只能将配方排入一次。 但是,如果他们碰巧选择了已经在队列中的配方,我真的不想用错误消息打扰用户,我只想忽略该配方。 如果违反了唯一约束,上面的代码将抛出SQLexception。 解决这个问题的最佳方法是什么,只需忽略重复的行。 我目前的想法是: 1)首先从数据库加载用户的整个队列,然后首先检查该列表。 如果配方已存在,只需continue执行for循环。 优点:没有不必要的SQL插入发送到数据库。 缺点:较慢,特别是如果用户有一个大队列。 2)不要使用ActiveRecord,而是将整个recipeIds数组传递给SQL函数。 此函数将检查每行是否首先存在。 优点:潜在的速度,让SQL处理所有肮脏的工作。 缺点:打破ActiveRecord模式并需要新的DB代码,这通常难以维护并且实现成本更高。 3)每次循环后CreateAndFlush。 基本上,不要在单个事务中运行整个循环。 […]

无论关系中是否存在正确的Inverse(流畅的nhibernate)设置,NHibernate都会发出无关的更新语句

以下类以极少的方式表示我的遗留数据库的真实场景。 我可以添加新列,但这是我能做的全部,因为许多其他遗留应用程序使用了300多个表数据库,这些应用程序不会移植到NHibernate(因此无法从复合键迁移) : public class Parent { public virtual long Id { get; protected set; } ICollection children = new HashSet(); public virtual IEnumerable Children { get { return children; } } public virtual void AddChildren(params Child[] children) { foreach (var child in children) AddChild(child); } public virtual Child AddChild(Child child) { child.Parent = this; […]

QueryOver上的GroupBy SqlFunction

我有一个我使用的所有不同帐户名称前缀(az)的列表 var accounts = this.SessionManager.GetActiveSession().QueryOver(); var q = accounts.Select(Projections.Distinct( Projections.SqlFunction(“substring”, NHibernateUtil.String, Projections.Property(“Name”), Projections.Constant(1), Projections.Constant(1)))); 但是,我想要做的不是返回一个不同的列表,而是将前缀分组并返回以该前缀开头的帐户数,但我不确定如何使用查询来执行组,因为它不像标准那样简单LINQ。 我使用QueryOver而不是Query的原因是因为某些原因,子串函数正在内存中执行而不是在数据库服务器上执行。 这就是我通常会这样做的方式 var prefixes = (from acc in this.SessionManager.GetActiveSession().Query() group acc by acc.Name.Substring(0, 1) into grp select new { Prefix = grp.Key, Count = grp.Count() }); 编辑这是我尝试但我收到以下错误 表达式中无法识别的方法调用SqlFunction(“substring”,NHibernateUtil.String,new [] {Property(“Name”),Constant(Convert(1)),Constant(Convert(1))}) var accounts = this.SessionManager.GetActiveSession().QueryOver().Select( Projections.Group(x => Projections.SqlFunction(“substring”, NHibernateUtil.String, Projections.Property(“Name”), Projections.Constant(1), […]

流畅的NHibernate错误:实体’ClassMap`1’没有映射的Id

我正在将之前的项目从使用普通的NHibernate hbm.xml映射转换为Fluent NHibernate。 目前,我仍然坚持应该成为最后一步的工作之一。 我为DefaultAutomappingConfiguration添加了一个派生类来修改我的ID命名约定。 字符串“Id”附加到类名: public override bool IsId(FluentNHibernate.Member member) { return member.Name == member.DeclaringType.Name + “Id”; } 这应该使“代理商”在名为“AgencyId”的字段中具有ID。 相反,我收到此错误: The entity ‘ClassMap`1’ doesn’t have an Id mapped. Use the Id method to map your identity property. For example: Id(x => x.Id). {Name = “ClassMap`1” FullName = “FluentNHibernate.Mapping.ClassMap`1[[BackendDb.Model.Agency, BackendDb, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]”} 我在IsId函数上创建了一个断点,看看发生了什么: {Property: […]