基本问题:如何在Fluent NHibernate中创建双向一对多地图?
细节:
我有一个有很多孩子的父对象.在我的情况下,孩子没有父母,所以在数据库中,我想外键的母体有NOT NULL约束是没有意义的.我从Fluent NHibernate映射自动生成我的数据库.
我的父母有很多子对象,如下所示:
public class Summary
{
public int id {get; protected set;}
public IList<Detail> Details {get; protected set;}
}
public class Detail
{
public int id {get; protected set;}
public string ItemName {get; set;}
/* public Summary Owner {get; protected set;} */ //I think this might be needed for bidirectional mapping?
}
Run Code Online (Sandbox Code Playgroud)
这是我开始的映射:
public class SummaryMap : ClassMap<Summary>
{
public SummaryMap()
{
Id(x => x.ID);
HasMany<Detail>(x => x.Details);
}
}
public class DetailMap : …Run Code Online (Sandbox Code Playgroud) 有没有办法使用linq for nhibernate将fetchmode设置为渴望多个对象.似乎有一种扩展方法,它只允许我设置一个对象.但是我需要为多个对象设置它.这可能吗?谢谢
与使用QueryOver语法相比,我没有找到与NHibernate 3.0 LINQ Provider支持的内容的明确比较.从表面上看,似乎有两个很大的努力分为两个非常相似的东西.
使用每种产品有哪些关键的权衡取舍?
作为我上一个问题的后续跟进.我是一名ASP.NET程序员,我想知道NHibernate如何帮助我更轻松,更快地完成工作.假装我对NHibernate一无所知.它是什么,它能为我做什么?
我正在寻找关于设置nhibernate的教程.似乎很少有,但大多数是用胡言乱语写的,或者是一个非常古老的版本.
任何好的资源,甚至包括流畅或代码配置安装?
我是NHibernate的新手,在过早关闭会话时遇到了一些问题.我通过重用会话而不是每个事务打开一个会话来暂时解决了这个问题.但是,我的印象是,每次需要时打开会话都是会话生命周期管理的推荐方法.没有?
所以; 推荐的会话方式是什么?他们的一生应该是什么?一次会议交易?一个单一的会议来处理一切?或者是什么?
编辑:
请注意,我的应用程序体系结构是与服务器端服务通信的桌面应用程序,这是使用NHibernate + Fluent进行的所有数据库处理.(如果这有任何区别......)
想象一下以下(简化)数据库布局:

我们有许多"假期"记录,涉及在特定日期前往特定住宿等.
我想从数据库中提取每个住宿的"最佳"假期(即最低价格),给定一组搜索标准(例如持续时间,出发机场等).
将有多个具有相同价格的记录,因此我们需要选择保存(降序),然后按出发日期升序.
我可以写SQL来做这个看起来像这样(我不是说这必然是最优化的方式):
SELECT *
FROM Holiday h1 INNER JOIN (
SELECT h2.HolidayID,
h2.AccommodationID,
ROW_NUMBER() OVER (
PARTITION BY h2.AccommodationID
ORDER BY OfferSaving DESC
) AS RowNum
FROM Holiday h2 INNER JOIN (
SELECT AccommodationID,
MIN(price) as MinPrice
FROM Holiday
WHERE TradeNameID = 58001
/*** Other Criteria Here ***/
GROUP BY AccommodationID
) mp
ON mp.AccommodationID = h2.AccommodationID
AND mp.MinPrice = h2.price
WHERE TradeNameID = 58001
/*** Other Criteria Here ***/
) x on h1.HolidayID = x.HolidayID and …Run Code Online (Sandbox Code Playgroud) 当你在流畅的NHibernate中设置字符串值时,它会将数据库值设置为Nvarchar(255),我需要存储相当多的基于用户输入的长字符串,而255是不切实际的.
只是为了添加这个是自动播放器的问题,因为我使用流畅的NHibernate来构建数据库.
c# nhibernate fluent-nhibernate automapping sharp-architecture
我试图将一些非常长的文本插入到字符串prop中 - 它与LinqToSql完全一致,现在我已切换到NHibernate并希望保存相同的实体,但nHibernate会抛出上述异常.
我怎样才能解决这个问题?
最初我的道具被定义为:
Map(x => x.Content, "fT_Content").Nullable();
Map(x => x.Fields, "fT_Fields").Nullable();
Run Code Online (Sandbox Code Playgroud)
现在他们是:这有效,但为什么我必须这样做?
Map(x => x.Content, "fT_Content").CustomSqlType("nvarchar(max)").Length(Int32.MaxValue).Nullable();
Map(x => x.Fields, "fT_Fields").CustomSqlType("nvarchar(max)").Length(Int32.MaxValue).Nullable();
Run Code Online (Sandbox Code Playgroud)
注意:我使用nuget有最新的nhibernate.
对于ref,这里是字段:
public virtual string Content
{
get;
set;
}
public virtual string Fields
{
get;
set;
}
Run Code Online (Sandbox Code Playgroud)
我想避免去生产,突然插入停止在这张桌子上工作....