Tag: nhibernate mapping

流畅的NHibernateexception在集合之间移动对象

将一个对象从一个集合移动到另一个集合时,当cascade设置为all-delete-orphan时,我得到以下exception: 已删除的对象将通过级联重新保存(从关联中删除已删除的对象) 我认为当你使用all-delete-orphan时,nhibernate不会在另一个集合中引用它时删除它。 任何人都可以确认,当你有像文件夹这样的对象包含文件夹或文件并将文件从一个文件夹移动到另一个文件夹时,你不应该得到这个例外吗? 我在vs2010中制作了一个示例项目来演示这种行为。 任何人都可以说我的映射是正确的还是nhibernate中有错误? FileMapping.cs public class FileMapping: ClassMap { public FileMapping() { Id(x => x.Id, “Id”).GeneratedBy.Native(“File_seq”); Map(x => x.Name, “Name”).Not.Nullable(); References(x => x.Folder).Not.Nullable().Column(“idFolder”); } } FolderMapping.cs public class FolderMapping: ClassMap { public FolderMapping() { Id(x => x.Id, “Id”).GeneratedBy.Native(“Folder_seq”); Map(x => x.Name, “Name”).Not.Nullable(); HasMany(x => x.Folders).Inverse().Cascade.AllDeleteOrphan().KeyColumn(“idParentFolder”); HasMany(x => x.Files).Inverse().Cascade.AllDeleteOrphan().KeyColumn(“idFolder”); References(x => x.ParentFolder).Nullable().Column(“idParentFolder”); } […]

在Fluent中使用时间类型Nhibernate生成exception“无法将类型’System.DateTime’的对象强制转换为’NHibernate.Type.TimeType’

我发现NHibernate有几个内置类型 ,它们不存在于C# ,但存在于某些SGBD中。 现在我有以下内容: public class TimeSlot : EntityBase { public virtual NHibernate.Type.TimeType FromTime { get; set; } public virtual NHibernate.Type.TimeType ToTime { get; set; } } public class TimeSlotMap : ClassMap { public TimeSlotMap() { Id(c => c.Id).GeneratedBy.Identity(); Map(c => c.FromTime); Map(c => c.ToTime); } } 在MSSQL中,此表看起来像附加图像 现在,当我尝试查询此表时,我遇到以下exception: 无法将类型为“System.DateTime”的对象强制转换为“NHibernate.Type.TimeType” 我做错了什么? Fluent NHibernate如何使用Time Date Type?

在NHibernate中规范化EnumStringType

我目前在NHibernate中使用枚举如下映射.. public enum UploadMethod { Java, Silverlight, Gears, Flash } class UploadMethodType : EnumStringType { public UploadMethodType() : base(typeof(UploadMethod), 255) { } } public class Person { /* Bunch of non interesting properties… */ public UploadMethod PreferredUploadMethod { get; set; } } 除了数据库远离规范化之外,其中的工作完全正常,People表中的每一行都有一个包含四个文本字符串之一的列。 我现在将它分成一个新表,但我不确定如何在NHibernate中创建映射。 我的第一直觉只是但是我不希望这个枚举成为它自己的实体,我基本上只需要NHibernate来做一个简单的连接来增加额外的列。 作为一个止损,我刚刚创建了一个视图,它工作得很好,但我宁愿那个抽象层在我的NHibernate映射中,而不是模式。

Fluent NHibernate将IList 映射为单列的值

我有这堂课: public class MyEntity { public virtual int Id { get; set; } public virtual IList Vectors { get; set; } } 如何将Fluent NHibernate中的Vectors映射到单个列(作为值)? 我在想这个: public class Vectors : ISerializable { public IList Vectors { get; set; } /* Here goes ISerializable implementation */ } public class MyEntity { public virtual int Id { get; […]

object引用未保存的瞬态实例在刷新之前保存瞬态实例

我有一个自我加入员工实体类,其id,name和ref列与self相关。 我想创建它的新实例并将其持久化到db。 起初我创建了一个Employee类的实例并将其命名为manager。 然后我从Employee表中获取了这些值的记录:Id = 1,Name =“A”,RefId = null并将这些值设置为manager对象。 之后我再次创建了Employee类的实例 并设置它的属性值如下:emp.Name =“B”,emp.Ref = manager。 最后我通过使用base.Add(resource)方法来坚持它。 那时Nhibernate引发了以下错误:“对象引用未保存的瞬态实例,在刷新之前保存瞬态实例”。 这是映射文件内容: class> 请帮我解决这个错误。 谢谢

在Fluent NHibernate中引用具有公式的实体

我有一个具有N:1父子关系的模式,该模式存储在另一个表中并由公式选择。 是否可以使用公式将此实体映射到父级? public class ParentEntity { public virtual int ParentId { get; set; } public virtual ChildEntity Child{ get; set; } } public class ParentMapping : ClassMap { public ParentMapping() { Table(“ParentTable”); Id(x => x.ParentId).Column(“ParentId”).GeneratedBy.Assigned().Not.Nullable(); References(x => x.Child).Formula( @”( SELECT TOP 1 ChildTable.ChildId FROM ChildTable WHERE ChildTable.ParentId = ParentId )” ); } } 此映射生成的SQL如下所示: SELECT […]

nhibernate不会级联删除子项

方案如下, 我有3个对象(我简化名称)名为Parent,parent的child和child的孩子 父母的孩子是父母的集合,孩子的孩子是孩子的集合。 映射如下(相关部分) 亲 父母的孩子 我想要实现的是,当我删除父母时,会有一个级联删除一直到孩子的孩子。 但目前发生的是这个。 (这纯粹用于映射测试目的)获取父实体(工作正常) IQuery query = session.CreateQuery(“from Parent where ID =” + ID); IParent doc = query.UniqueResult(); 现在删除部分 session.Delete(doc); transaction.Commit(); 在使用级联和反向解决了“无法插入空值”错误之后,我希望现在可以使用此代码删除所有内容,但只删除父项。 我错过了可能错过的映射中的某些内容吗? 任何正确方向的提示都非常受欢迎! 迭戈,谢谢你的回答。 (和解释) 我去除了on-delete=”cascade” ,这是因为我喜欢在代码中尽可能多地控制而不是在数据库中。 下面发布的代码是(工作)结果。 亲 父母的孩子 希望这可以帮助人们解决同样的问题!

流畅的nHibernate自动化属性为nvarchar(max)

使用流畅的nhibernate和自动化(nhibernate创建我的数据库模式),我怎么能得到nhibernate在数据库中基于以下类创建一个nvarchar(max)列 public class VirtualPage : BaseEntity { public virtual int ParentId { get; set; } public virtual string PageName { get; set; } public virtual string Title { get; set; } public virtual string Body { get; set; } public virtual string ViewName { get; set; } public virtual string ViewData { get; set; } […]

NHibernate多对多关系问题:可以选择,无法更新

每个用户都有一个角色列表: 我正在跟踪SQL服务器的所有查询。 当我选择用户时,我也看到了SQL SELECT语句(这是好的)。 问题是当我尝试更新现有用户(具有角色)时:我只看到User表的更新,但没有User_Role (这是坏的)。 澄清一下:我不希望在Role表中插入/更新(但在User_Role ,因为角色是“永久的”并且可以自由地附加和分离。 为什么选择正常,但不更新 。 请? 如果需要更多信息 – 请问 – 我会尝试回答所有次要问题。 更新: Role映射: 更新N2:这是表的定义方式: Role表: CREATE TABLE [Roles] ( [Id] INTEGER NOT NULL PRIMARY KEY, [Name] text NOT NULL, [LastChanged] INT NOT NULL DEFAULT(0) ); CREATE UNIQUE INDEX uidxUserName ON Roles (Name COLLATE NOCASE); User表: CREATE TABLE [Users] ( [Id] […]

NHibernate只有存储过程

我想让NHibernate在调用ISession.Get时通过其键而不是使用动态SQL来获取实体时调用存储过程。 我们一直在使用NHibernate并允许它为查询和插入/更新/删除生成SQL,但现在可能必须将我们的应用程序部署到需要我们使用存储过程进行所有数据库访问的环境中。 我们可以在.hbm.xml映射文件中使用sql-insert,sql-update和sql-delete进行插入/更新/删除。 我们的hql和条件查询必须用存储过程调用替换。 但是,我还没有想出如何强制NHibernate使用自定义存储过程来获取按键的实体。 我仍然希望能够调用ISession.Get,如: using (ISession session = MySessionFactory.OpenSession()) { return session.Get(customerId); } 还有延迟加载对象,但我希望NHibernate调用我的“GetCustomerById”存储过程而不是生成动态SQL。 可以这样做吗? 考虑到我们必须支持的新环境,NHibernate可能不再合适。