我们的系统上有用户和人员。每个用户有很多人。但是当用户登录时,我们需要查找他的主要人员记录以填写他的姓名、地址、电话等。
public class Person
{
/// <summary>Every Person belongs to a user.</summary>
public virtual User User { get; set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual string Address { get; set; }
public virtual string Phone { get; set; }
// More methods & Properties
}
public class User : Entity
{
public virtual string Username { get; set; }
public virtual string Password …Run Code Online (Sandbox Code Playgroud) 我看到围绕 NH Fluent 接口产生了很多嗡嗡声,那么使用 Fluent 而不是 XML 映射和 Criteria API 有什么好处?
在我正在进行的一个项目中,我有四个实体(以及其他一些实体),WorkOrder、Crew、CrewAssignment 和 Contractor。他们的关系是这样的:
我遇到的问题是设置 WorkOrder 可以有多个 CrewAssignments 的最后一部分。我想要做的是确保 WorkOrder.CrewAssignments 属性只返回与工作订单具有相同承包商的 CrewAssignments。或者,不那么冗长,“WorkOrder.Contractor == CrewAssignment.Crew.Contractor”。
我唯一能想到的就是这个,但它抛出了一个关于 x 变量未定义的异常。
HasMany(x => x.CrewAssignments).KeyColumn("WorkOrderID").Where(x => x.Crew.Contractor == x.WorkOrder.Contractor);
Run Code Online (Sandbox Code Playgroud)
做这样的事情甚至可能吗?还是我完全在错误的树上吠叫?谷歌整个上午都在用这个让我失望。有任何想法吗?
我无法序列化然后立即反序列化大对象而不会出现问题。我遵循以下建议: JSON.NET 和 nHibernate 集合延迟加载 和 JSON.Net NHibernate 代理序列化 (NH 3.3.2.4000),以使 Json.Net 与我的遗留系统一起工作。尽管尝试了这些建议并进行了各种组合,但我没有成功。以下是我理解的对我来说最有意义的设置。
转换器:
protected override List<MemberInfo> GetSerializableMembers(Type objectType)
{
if (typeof(INHibernateProxy).IsAssignableFrom(objectType))
{
return base.GetSerializableMembers(objectType.BaseType);
}
else
{
return base.GetSerializableMembers(objectType);
}
}
Run Code Online (Sandbox Code Playgroud)
主要代码:
var jsonSerializerSettings = new JsonSerializerSettings
{
ContractResolver = new NHibernateContractResolver(),
PreserveReferencesHandling = PreserveReferencesHandling.All,
TypeNameHandling = TypeNameHandling.Auto,
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
ObjectCreationHandling = ObjectCreationHandling.Replace
};
string serialisedEnquiry = JsonConvert.SerializeObject(enquiry, Formatting.Indented, jsonSerializerSettings);
Enquiry enq = JsonConvert.DeserializeObject<Enquiry>(serialisedEnquiry, jsonSerializerSettings);
Run Code Online (Sandbox Code Playgroud)
我还有另一个开放的问题,可能值得注意:JSON.net null property 尽管正如您将在最后一条评论中看到的那样,我相信我已经解决了它。我只是在等待解决这个问题,以确认另一个问题已修复,而不是简单地被这个新错误埋葬/替换。
流畅的 NHibernate 1.4.0.0
NHibernate 3.3.1.4000
Netwonsoft.Json 6.0.0.0 …
你如何在Fluent NHibernate中映射以下内容?
参见"18.3.客户/订单/产品"
http://www.hibernate.org/hib_docs/nhibernate/html/example-mappings.html
我有以下FNH映射片段:
HasManyToMany((c) => c.Plaintiffs)
.LazyLoad()
.WithTableName("invoicePlantiff")
.WithChildKeyColumn("PersonReferenceID")
.WithParentKeyColumn("invoiceID")
.FetchType.Join();
Run Code Online (Sandbox Code Playgroud)
产生以下HBM:
<bag name="Plaintiffs" access="iServe.Design.CslaNHibernate.CslaChildPropertyAccessor, iServe, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" lazy="true" table="invoicePlantiff">
<key column="invoiceID" />
<many-to-many column="PersonReferenceID" class="iServe.PersonReference, iServe, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" fetch="join" />
</bag>
Run Code Online (Sandbox Code Playgroud)
问题是我正在处理遗留数据,我们只是说'不太理想',而且有些记录有无效的ID,所以我需要将not-found="ignore"属性放在包中的多对多标签上.我没有看到任何方法来实现这一点与FNH.
还有就是.NotFound.Ignore()在References()通话,但不是在HasManyToMany通话.
有人能告诉我我错过了什么吗?即使在渲染之后"注入"属性是一个黑客攻击/在配置NH之前很好,我只需要它就可以工作了.
提前致谢.
UPDATE gcores答案不起作用,它将其添加到错误的标签,请参阅我对其答案的评论以获取更多信息.
我们有一个庞大的系统通过Unity与其数据源(Navision)松散绑定 - 我们有机会将其交换出来并拥有自己的数据库.
所以我们已经浏览了一下,并且非常喜欢Fluent NHibernate的外观 - 我们试图获得概念验证并交换掉一些服务.
我们想要使用NHibernates HiLo算法 - 不幸的是我们从Navision继承了字符串ID,它的ID是前缀(例如COL00001),所以要匹配我们需要使用字符串Id的接口.
有谁知道我会怎么样......
Id(x => x.ID).GeneratedBy.HiLo("100");
Run Code Online (Sandbox Code Playgroud)
在ID是字符串的地方工作?我们目前正在获取Identity必须是int,long等
谢谢,
安迪
------更新------
我在文章建议中尝试了这个例子但是这个功能已经从Fluent NHibernate的更高版本中删除了 - 但是有一个.Custom - 但我似乎无法让它工作!
public class ManufacturerMap : ClassMap<Manufacturer>
{
public ManufacturerMap()
{
Id(x => x.ID).GeneratedBy.Custom(typeof(StringTableHiLoGenerator));
Map(x => x.Name);
}
}
public class StringTableHiLoGenerator : TableHiLoGenerator
{
public override object Generate(ISessionImplementor session, object obj)
{
return base.Generate(session, obj).ToString();
}
}
Run Code Online (Sandbox Code Playgroud) 抱歉,如果已经问过这个问题但是,我看了一眼,找不到任何东西.我试图找出在C#中模拟以下内容的最佳方法.我勾勒出了一些想法,但没有一个感觉正确.
我创建了一个抽象的'Person'类.我的应用程序将拥有客户和员工.显然,客户是个人员工是个人
最后,我想使用Fluent NHibernate进行映射.我一直认为这应该很简单,我只是不直接思考,但是我可以使用哪种模式来解决这个问题.
谢谢.
如果我想从类的属性创建DTO,所有这些都被映射,我可以不编写常规SQL语句吗?
我已经看过很多关于制作DTO课程以及使用它的文档,但关于它是如何创建的并不多.我见过与Transformer一起使用的SQL查询,但这需要使用魔术字符串.
编辑:
感谢您的评论.我知道有多种方法可以检索DTO,但我一直无法找到不使用SQL/HQL的方法示例.是否有某个地方的参考,或者这是NHibernate稀疏记录的区域之一?
在这里,我获得了一个代表可以访问的代理商列表.
var agencies = _session.QueryOver<AgencyRep>()
.JoinQueryOver<AgencyRepsSecondaryAgency>(r => r.AgencyRepsSecondaryAgencies)
.Where(a => a.AgencyRepId == user.Id)
.List();
Run Code Online (Sandbox Code Playgroud)
在我得到我的代理商列表之后,我想进行SQL搜索,其中值为agencies.id列.
var data = _session.QueryOver<Staging.Case>()
.Where(x => x.AgencyId ???? agencies)
.List();
Run Code Online (Sandbox Code Playgroud)
不知道如何用流利的nhibernate实现这样的东西.任何帮助将不胜感激.