每当我尝试创建一个特定的实体时获得这个......只是想知道我应该如何找出原因.
我正在使用Fluent NHibernate自动化,所以也许我没有适当地设置约定和/或需要覆盖一个或多个映射文件中的某些东西.我已经通过网络上关于这个问题的一些帖子,并且很难弄清楚为什么它会发生在我的案例中.
我正在保存的对象非常简单.它是一个引用"公司"实体并具有"地址"实体集合的"人"对象.UPDATES在已存在于数据库中的现有Person对象上正常工作.
建议?
谢谢-wg
所以一切都与基本的鉴别器映射很好地协调.我可以毫无问题地直接与实体A和B进行交互.
public class BaseType {}
public class EntityA : BaseType {}
public class EntityB : BaseType {}
Run Code Online (Sandbox Code Playgroud)
这在BaseType映射中没有戏剧性地映射为
DiscriminateSubClassesOnColumn<string>("Type")
.SubClass<BaseType>("A", m => { })
.SubClass<BaseType>("B", m => { });
Run Code Online (Sandbox Code Playgroud)
在以下情况下会出现问题:在聚合中,我们要将集合映射到每个子类
使用如下的映射
public class AggregateMap: BaseMap<Aggregate>
{
public AggregateMap()
{
HasMany<EntityA>(x => x.ACollection).AsSet().Cascade.All();
HasMany<EntityB>(x => x.BCollection).AsSet().Cascade.All();
}
}
Run Code Online (Sandbox Code Playgroud)
这些显然不是完整的映射,但是最低限度的描述我正在尝试的东西.添加到ACollection和BCollection的项目在保存Aggregate时通过级联正确保留.然而,当检索到聚合时,对类型歧视存在混淆.
我已经经历了许多不同的可能解决方案,我不再知道什么不起作用.我觉得我不应该在集合上提供where子句,但事情对我来说不起作用.
任何线索将不胜感激.
我有一个以流畅的nhibernate映射的类,但我希望映射忽略其中一个类属性.
使用下面的类和映射我得到此错误:
以下类型不能用作代理:iMasterengine.Data.Model.Calendar:方法get_HasEvents应该是虚拟的
//my class
public class Calendar : IEntity {
public virtual int Id { get; private set; }
public virtual string Name { get; set; }
public virtual string SiteId { get; set; }
public virtual IList<CalendarEvent> Events { get; set; }
//ignore this property
public bool HasEvents { get { return Events.Count > 0; } }
}
//my mapping
public class CalendarMap : ClassMap<Calendar> {
public CalendarMap() {
Id(x => x.Id);
Map(x => x.Name);
Map(x => x.SiteId); …Run Code Online (Sandbox Code Playgroud) 我知道我可以Map(x => x.GroupName).WithUniqueConstraint()为一个单一的财产.
但是如何在流畅的nHibernate中创建复合唯一约束(其中唯一约束对两列的组合进行操作)?
我有一个对象的层次结构,订单,联系人,地址:
public class Order {
public virtual Contact BillingContact { get; set; }
}
public class Contact {
public virtual Address Address { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想通过id查询订单,并急切加载billingcontact及其地址.
var criteria = DetachedCriteria.For<Order>()
.SetFetchMode("BillingContact", FetchMode.Eager)
Run Code Online (Sandbox Code Playgroud)
此标准急切加载BillingContact,但可以理解的不是BillingContact的地址.如果我添加:
.SetFetchMode("BillingContact.Address", FetchMode.Eager)
Run Code Online (Sandbox Code Playgroud)
这无济于事.
另请注意,这些关系是单向的:
public OrderMap()
{
References(x => x.BillingContact)
.Not.Nullable()
.Cascade.All();
}
public ContactMap()
{
HasOne(x => x.Address)
.Cascade.All()
.FetchType.Join();
}
public AddressMap()
{
Map(x => x.Address1);
}
Run Code Online (Sandbox Code Playgroud)
如何构建一个可以加载孩子孩子的标准对象?这些关系映射看起来是否正确?
是否可以使用Fluent NHibernate生成表索引以及数据库模式的其余部分?我希望能够通过自动构建过程生成完整的数据库DDL.
我已经被提交并已经开始学习Fluent NHibernate(没有以前的NHibernate经验).在我的项目中,我正在编程接口以减少耦合等.这意味着几乎所有"一切"都指的是接口而不是具体类型(IMessage而不是Message).这背后的想法是通过能够模拟依赖关系来帮助使其更易于测试.
然而,(流利的)当我尝试映射到接口而不是具体类时,NHibernate并不喜欢它.问题很简单 - 根据Fluent Wiki,定义我的类的ID字段是明智的
int Id { get; private set; }
Run Code Online (Sandbox Code Playgroud)
获取典型的自动生成的主键.但是,这只适用于具体的类 - 我不能在接口上指定访问级别,同一行必须是这样
int Id { get; set; }
Run Code Online (Sandbox Code Playgroud)
并且我认为否定在具体类中使setter私有(想法是只有NHibernate应该将ID设置为由DB分配).
就目前而言,我想我只会公开制定者并试图避免写入它的诱惑..但是有没有人知道什么是"正确的",最佳实践方式来创建一个正确的主键只有NHibernate可以写入的字段,而仍然只编程到接口?
更新
根据我从mookid和James Gregory的两个答案之后的理解,我可能走错了路 - 我不应该有理由让每个实体拥有一个接口,就像我现在一样.这一切都很好.我想我的问题就变成了 - 是否没有理由对任何实体的接口进行100%编程?如果甚至有一种情况可以证明这是合理的,那么可以用(流利的)NHibernate做到这一点吗?
我问,因为我不知道,不要批评.谢谢你的回复.:)
(很长一段时间)我一直在寻找一个如何使用Fluent NHibernate 正确实现一对一映射的示例.
我找到的大多数资源都说:
我认为你的意思是多对一的
然而,没有人真正举例说明如何正确实现一对一关系.
那么,你能用Fluent NHibernate给出一对一的映射示例吗?
注意:我对那些说"你的模型是什么,你可能真的需要HasMany "的人不感兴趣.不,谢谢,我只需要一对一的例子.
更确切地说,我知道语法.这是我自己搜索唯一能找到的东西.我正在寻找的是一个更完整的例子,包括一个((非常)简单的)数据库设置,以及参与该关系的所有实体的整个映射,我认为它对Stack Overflow来说具有合理的大小.
我收到此异常(底部的完全例外):
NHibernate.PropertyValueException was unhandled by user code
Message="not-null property references a null or transient
valueClearwave.Models.Encounters.Insurance.Patient"
Source="NHibernate"
EntityName="Clearwave.Models.Encounters.Insurance"
PropertyName="Patient"
Run Code Online (Sandbox Code Playgroud)
我已经做了很多谷歌搜索,似乎这个错误最常见的原因是当一个关联是双向的但只有一半被设置.如:Insurance.Patient =患者被叫,但Patient.Insurances.Add(保险)不是.事实上,我确实有这样的场景,但我在调用Save之前检查了对象,并且Insurance.Patient和Patient.Insurances [0]都是正确的对象.
此异常似乎引用的另一种可能性是瞬态值.在我的情况下,每个对象都是暂时的,所以我怀疑问题的根源在这里.但是,现在一切都需要暂时,因为还没有保存.我希望NHibernate能够持久存在而不是抱怨它们不会被持久存在.
以下是我映射的一些片段(流利):
public PatientMap()
{
WithTable("tPatient");
Id(x => x.Id, "uid_Patient").GeneratedBy.GuidComb
().Access.AsReadOnlyPropertyThroughCamelCaseField();
HasMany(x => x.Insurances).WithKeyColumn("uid_Patient")
.Cascade.All()
.Inverse();
...
}
public InsuranceMap()
{
WithTable("tPatientInsuranceInfo");
Id(x => x.Id,
"uid_PatientInsuranceInfo").GeneratedBy.GuidComb
().Access.AsReadOnlyPropertyThroughCamelCaseField();
References(x => x.Patient, "uid_Patient").Not.Nullable
().Cascade.All();
...
}
Run Code Online (Sandbox Code Playgroud)
那么,可能是什么问题呢?
NHibernate.PropertyValueException was unhandled by user code
Message="not-null property references a null or transient
valueClearwave.Models.Encounters.Insurance.Patient"
Source="NHibernate"
EntityName="Clearwave.Models.Encounters.Insurance"
PropertyName="Patient"
StackTrace:
at NHibernate.Engine.Nullability.CheckNullability(Object[]
values, IEntityPersister …Run Code Online (Sandbox Code Playgroud) c# nhibernate exception nhibernate-mapping fluent-nhibernate
使用nhibernate时如何添加NOLOCK?(标准查询)