假设您有两个表,"Users"和"UserRoles".以下是两个表的结构(表 - 列):
用户 - UserID(int)
UserRoles - UserID(int),角色(字符串)
我想要的是我的域中的"用户"类具有IList角色.如何构建我的Fluent NHibernate映射来实现这一目标?
我希望使用NHibernate创建多对多的关系.我不确定如何在XML文件中映射这些.我还没有创建类,但它们只是基本的POCO.
人
PERSONID
名
能力
胜任
标题
Person_x_Competency
personId
competencyId
我是否会在每个POCO中为另一个类创建一个List?然后使用NHibernate配置文件以某种方式映射它们?
nhibernate many-to-many nhibernate-mapping xml-configuration
映射属性是否提供与nhib hbm相同的多功能性?你能和FNH一起使用它们来处理FNH还没有像hbm那样做的东西吗?
干杯,
Berryl
通过映射属性,我不是指hbm文件; NHIB(或者现在可能是NHib贡献者)显然存在属性,用于装饰类和类属性.我猜这些早期的FNH,但不确定.
似乎NHibernate需要将一个id标记指定为映射的一部分.这给视图带来了问题,因为大多数时候(根据我的经验)视图都没有Id.我之前在nhibernate中映射了视图,但是我这样做的方式对我来说似乎很混乱.
这是我目前如何做的一个人为的例子.
制图
<class name="ProductView" table="viewProduct" mutable="false" >
<id name="Id" type="Guid" >
<generator class="guid.comb" />
</id>
<property name="Name" />
<!-- more properties -->
</class>
Run Code Online (Sandbox Code Playgroud)
查看SQL
Select NewID() as Id, ProductName as Name, --More columns
From Product
Run Code Online (Sandbox Code Playgroud)
类
public class ProductView
{
public virtual Id {get; set;}
public virtual Name {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
我不需要产品的ID或者在某些视图的情况下我可能没有视图的ID,这取决于我是否可以控制View
有没有更好的方法将视图映射到nhibernate中的对象?
编辑
答案到目前为止
制图
<class name="ProductView" table="viewProduct" mutable="false" >
<id name="Id" type="Guid" />
<property name="Name" />
<!-- more properties -->
</class>
Run Code Online (Sandbox Code Playgroud)
类
public class ProductView …Run Code Online (Sandbox Code Playgroud) 假设我有以下实体:
public class CalculationInfo
{
public virtual Int64 Id { get; set; }
public virtual decimal Amount { get; set; }
public virtual decimal SomeVariable { get; set; }
public virtual decimal SomeOtherVariable { get; set; }
public virtual decimal CalculatedAmount
{
get
{
decimal result;
// do crazy stuff with Amount, SomeVariable and SomeOtherVariable
return result;
}
}
}
Run Code Online (Sandbox Code Playgroud)
基本上我想用NHibernate读取和写入我的数据库的所有字段,除了CalculatedAmount,我只是想写,而不是回读.
每个类似的问题和相应的答案都涉及为值指定一个后备存储,我在这种情况下不会有.
如何使用Fluent NHibernate完成此操作?
谢谢!
更新: 这是我尝试过的,以及它导致的错误:
这是我对该物业的映射......
Map(x => x.CalculatedAmount)
.ReadOnly();
Run Code Online (Sandbox Code Playgroud)
它产生的例外......
无法在类'xxx.CalculationInfo'中找到属性'CalculatedAmount'的setter
我有一个由以下类表示的文件夹层次结构:
public class Folder
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual Folder ParentFolder { get; set; }
public virtual ICollection<Folder> SubFolders { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
换句话说,每个都Folder可以属于一个ParentFolder,也可以属于SubFolders它.我正在使用Fluent NHibernate Automapper并使用自动生成数据库模式SchemaExport.当我尝试保存一些测试文件夹时,我得到下表:
Id | Name | ParentFolder_id | Folder_id
----------------------------------------------------------------
1 | Root Folder (has children) | NULL | NULL
2 | Root Folder (no children) | NULL | NULL
3 | …Run Code Online (Sandbox Code Playgroud) 使用NHibernate时,在什么情况下你会选择使用复合元素映射集合来提供值对象的集合,而不是创建一个完整的实体并使用一对多映射它?
您可能有一个值类型类'PostalAddress'来表示地址.如果您有一个人实体,并且每个人可以拥有许多地址,您可以像这样映射这种关系(选项1):
<bag name="Addresses" table="PersonAddress">
<key column="PersonID"/>
<composite-element class="PostalAddress">
<property name="StreetAddress"/>
<property name="Town"/>
<property name="City"/>
<property name="Postcode"/>
</composite-element>
</bag>
Run Code Online (Sandbox Code Playgroud)
或者您可以创建一个实体"PersonAddress",其上有一个"PostalAddress"类型的属性,并使用一对多关联映射地址(选项2):
<bag name="Addresses">
<key column="PersonID"/>
<one-to-many class="PersonAddress"/>
</bag>
<class name="PersonAddress">
<id name="Id">
<generator class="native"/>
</id>
<component name="Address" class="PostalAddress">
<property name="StreetAddress"/>
<property name="Town"/>
<property name="City"/>
<property name="Postcode"/>
</component>
</class>
Run Code Online (Sandbox Code Playgroud)
是否有任何理由不做选项1?PersonAddress表有ID列的事实是否应该是一个实体本身,因此使用选项2?
在我的应用程序中,我需要与多个数据库进行通信.我在NHibernate中通过为每个数据库创建一个SessionFactory来处理它(我认为这是正确的事情).所以我有两组模型(每个数据库一个)和两组Fluent NHibernate ClassMap<>映射.两者都在同一个项目中(由命名空间分隔),我想保持这种方式.
创建SessionFactory时出现问题.据我所知,Fluent NHibernate基本上有两种添加映射的方法:
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<UserClassMap>())
.Mappings(m => m.FluentMappings.Add<UserClassMap>()
Run Code Online (Sandbox Code Playgroud)
如果我使用第一个重载,那么我的会话工厂将获得两个数据库的所有映射.如果我使用第二个,我必须指定每个单独的ClassMap.我喜欢类似的东西FluentMappings.AddFromNamespace().有没有办法做到这一点?
nhibernate nhibernate-mapping fluent-nhibernate fluent-nhibernate-mapping
我正在用C#编写桌面项目.我正在使用Nhibernate与数据库进行通信.此外,我使用FluentNhibernate进行模型映射,但我陷入了映射的某些部分.这是ProductMap中的My mapping Class
松动地图
public LosingMap()
{
Id(x => x.id);
Map(x => x.reason);
Map(x => x.quantity);
Map(x => x.lose_sum);
Map(x => x.rate);
Map(x => x.deleted);
Map(x => x.create_date);
Map(x => x.update_date);
References(x => x.currency).Column("CurrencyCode");
Table("Loosing");
}
}
Run Code Online (Sandbox Code Playgroud)
这是CurrencyMap
CurrencyMap
public CurrencyMap()
{
Id(x => x.id);
Map(x => x.code).UniqueKey("currency_code");
Map(x => x.name);
Map(x => x.shname);
Map(x => x.symbol);
Map(x => x.deleted);
HasMany(x => x.Losings).Cascade.All();
Table("currency");
}
}
Run Code Online (Sandbox Code Playgroud)
这里是我在我的货币表中有一个主键和一个唯一键我怎么能在我的LoosingMap类中引用我的唯一而不是主键???
我一直在经历一种奇怪的行为(至少对我而言)ISession.Refresh().
我有一个带有延迟加载的子集合的实体,以及一个访问此集合的只读属性,它们都包含在二级缓存中.ISession.Refresh()在将事务提交到DB后,我在长会话中使用以获取最新数据,并获得以下错误:
NHibernate.Exceptions.GenericADOException : could not initialize a collection: [Test.NUnit.DBTest.TestModel.ParentTestEntity.Children#d4251363-cf88-4684-b65a-9f330107afcf][SQL: SELECT children0_.ParentTestEntity_id as ParentTe4_1_, children0_.Id as Id1_, children0_.Id as Id42_0_, children0_.RowVersion as RowVersion42_0_, children0_.Parent_id as Parent3_42_0_ FROM "ChildTestEntity" children0_ WHERE children0_.ParentTestEntity_id=?]
----> System.NullReferenceException : Object reference not set to an instance of an object.
at NHibernate.Loader.Loader.LoadCollection(ISessionImplementor session, Object id, IType type)
at NHibernate.Loader.Collection.CollectionLoader.Initialize(Object id, ISessionImplementor session)
at NHibernate.Persister.Collection.AbstractCollectionPersister.Initialize(Object key, ISessionImplementor session)
at NHibernate.Event.Default.DefaultInitializeCollectionEventListener.OnInitializeCollection(InitializeCollectionEvent event)
at NHibernate.Impl.SessionImpl.InitializeCollection(IPersistentCollection collection, Boolean writing)
at NHibernate.Collection.AbstractPersistentCollection.Initialize(Boolean writing)
at NHibernate.Collection.AbstractPersistentCollection.ReadSize()
at NHibernate.Collection.PersistentBag.get_Count() …Run Code Online (Sandbox Code Playgroud)