我如何使用反向属性?如果我没有弄错,对于一对多关系,inverse属性必须设置为true.对于多对多关系,其中一个实体类逆属性必须设置为true,另一个设置为false.
任何人都可以对此有所了解吗?
我有一个名为ReportRequest的类:
public class ReportRequest
{
Int32 templateId;
List<Int32> entityIds;
public virtual Int32? Id
{
get;
set;
}
public virtual Int32 TemplateId
{
get { return templateId; }
set { templateId = value; }
}
public virtual List<Int32> EntityIds
{
get { return entityIds; }
set { entityIds = value; }
}
public ReportRequest(int templateId, List<Int32> entityIds)
{
this.TemplateId = templateId;
this.EntityIds = entityIds;
}
}
Run Code Online (Sandbox Code Playgroud)
它使用Fluent Hibernate映射为:
public class ReportRequestMap : ClassMap<ReportRequest>
{
public ReportRequestMap()
{
Id(x => x.Id).UnsavedValue(null).GeneratedBy.Native();
Map(x …
Run Code Online (Sandbox Code Playgroud) 我有一个映射的方式.
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Model.Entities" schema="etl" assembly="Model" default-lazy="false">
<class name="Model.Entities.DataField, Model" table="mdm_field">
<id name="FieldId" column="field_id" type="int">
<generator class="native" />
</id>
<many-to-one name="KeyField" class="Model.Entities.Key, Model" column="field_id" />
</class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)
现在在数据库中,mdm_field表中的field_id有时具有相关key_field表中不存在的值,因此它基本上是破坏了引用完整性.因为当我加载实体时,我得到一个错误"没有给定标识符的行存在".如何配置映射以适应这种情况,以便在这种情况下不会死亡.
我已经看到了一些decimal
在NHibernate项目中使用的示例,用于映射到Oracle中的整数列.现在,我使用int
,并long
在我的计划.
decimal
over int
/ long
?有什么好处?它表现更好吗?
基本问题:如何在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) 我来自ORM工具的实体框架和LLBL背景.
我被要求建立一个基于NHibernate的新系统.我从来没有这样做过,所以我带着新鲜的眼睛来看它.
使用Fluent NHibernate进行映射和NHibernate中的"按代码映射"有什么区别?有偏好吗?
nhibernate nhibernate-mapping fluent-nhibernate fluent-nhibernate-mapping
所以一切都与基本的鉴别器映射很好地协调.我可以毫无问题地直接与实体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子句,但事情对我来说不起作用.
任何线索将不胜感激.
是否可以使用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做到这一点吗?
我问,因为我不知道,不要批评.谢谢你的回复.:)
我的域模型根中有一个类,如下所示:
namespace Domain
{
public class Foo { ... }
}
Run Code Online (Sandbox Code Playgroud)
我还在另一个名称空间中有另一个具有相同名称的类:
namespace Domain.SubDomain
{
public class Foo { ... }
}
Run Code Online (Sandbox Code Playgroud)
对于我的映射,我有一个Mapping
目录,其子目录名称SubDomain
包含在Domain.SubDomain
命名空间中找到的域类的映射.他们都在同一个集会中.
但是,当我尝试使用NHibernate加载它们时,我不断得到DuplicateMappingException
...即使两个Foos都有不同的命名空间.我用来加载我的NHibernate配置的代码是这样的:
var cfg = new Configuration()
.Configure()
.AddAssembly("Domain");
Run Code Online (Sandbox Code Playgroud)
我如何告诉NHibernate让我使用两个具有相同名称(但名称空间不同)的实体?