我在两个班级之间有多对多的关系:比赛和球员
我在映射中设置了Cascade.SaveUpdate,但是在保存锦标赛实例时,玩家将不会保存到玩家表中.Nhibernate只在链接表中写入父键和子键列.DB是SQLite.
这些是映射
public TournamentMap()
{
WithTable("Tournaments");
Id(x => x.Name);
Map(x => x.Start).Access.AsLowerCaseField();
Map(x => x.End).Access.AsLowerCaseField();
HasManyToMany<Player>(x => x.Players)
.WithTableName("TournamentsPlayers")
.WithParentKeyColumn("tournamentName")
.WithChildKeyColumn("playerName").AsSet()
.Access.AsLowerCaseField()
.Cascade.SaveUpdate().LazyLoad();
References(x => x.Type).Access.AsLowerCaseField()
.TheColumnNameIs("typeName")
.Cascade.SaveUpdate();
}
public class PlayerMap : ClassMap<Player>
{
public PlayerMap()
{
WithTable("Players");
Id(x => x.Name);
HasManyToMany<Player>(x => x.Tournaments)
.Access.AsLowerCaseField()
.WithTableName("TournamentsPlayers")
.WithParentKeyColumn("playerName")
.WithChildKeyColumn("tournamentName").AsSet()
.Cascade.SaveUpdate().IsInverse().LazyLoad();
}
}
Run Code Online (Sandbox Code Playgroud) 我试图在NHibernate中使用"每个类层次结构表"策略在一个表中实现我的对象层次结构.我的NHibernate映射出错,可以通过一个简单的例子轻松复制.错误是:
System.NotSupportedException: Attempting to parse a null value into an sql string (column:activity0_.Type).
at NHibernate.SqlCommand.InFragment.ToFragmentString() in InFragment.cs: line 109
at NHibernate.Persister.Entity.SingleTableEntityPersister.DiscriminatorFilterFragment(String alias) in SingleTableEntityPersister.cs: line 551
Run Code Online (Sandbox Code Playgroud)
我可以使用以下域类重现这一点:
public interface IActivity
{
Guid Id { get; set; }
}
public abstract class Activity : IActivity
{
public DateTime StartTime { get; set; }
public Guid Id { get; set; }
}
public class Running : Activity
{
public string Where { get; set; }
}
public class Talking : Activity
{ …Run Code Online (Sandbox Code Playgroud) 我正在努力让NHibernate工作.我有这门课:
mm.k.Domain.Kampagne
Run Code Online (Sandbox Code Playgroud)
(命名空间/程序集是mm.k.Domain)
在另一个Visual Studio项目(Assembly mm.k.Infrastructure)中,我获得了我的映射文件(在Mappings目录中),我的hibernate.cfg.xml和一些存储库.
继承我的映射文件:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="mm.k.Domain"
namespace="mm.k.Domain">
<class name="Kampagne" table="Kampagner">
<id name="Id">
<generator class="identity" />
</id>
<property name="Navn" not-null="true" />
<property name="Logo" />
</class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)
当我配置会话时,我这样做:
_configuration.AddAssembly(typeof(mm.k.Domain.Kampagne).Assembly);
Run Code Online (Sandbox Code Playgroud)
那就是什么都行不通!致电时:
var test = session.Get<Kampagne>(kampagneId);
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:"没有持久性:mm.k.Domain.Kampagne"就像它没有注册嵌入式映射fild.请注意,我对映射文件的构建操作设置为Embedded Resource.
如果我将以上行更改为:
_configuration.AddFile(@"fullpath\mm.k.Infrastructure\Mappings\Kampagne.hbm.xml");
Run Code Online (Sandbox Code Playgroud)
一切都很好!
有任何想法吗?提前致谢.
很多天以来,我一直在做nhibernate.但今天我陷入了一个令人沮丧的问题,即映射异常.
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="IPC.Base.Domains" assembly="IPC">
<class name="MenuItem" table="dbo.COR_MenuItem" default-access="property" default-cascade="save-update" default-lazy="true">
<cache usage="read-only" region="completelyStatic"/>
<id name="Id" type="System.Int32">
<generator class="identity" />
</id>
<property name="Name" type="System.String" />
<property name="Order" column="DisplayOrder" />
<property name="Key" column="KeyChain" />
<property name="Route" />
<property name="ActionMethod" />
<property name="IsHotlink" />
<many-to-one name="ParentMenuItem" column="ParentMenuItemId" class="MenuItem" cascade="none"/>
<bag name="MenuItems" table="dbo.COR_MenuItem" cascade="none">
<cache usage="read-only" region="completelyStatic"/>
<key column="ParentMenuItemId" />
<one-to-many class="MenuItem" />
</bag>
</class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)
我确实有一个映射类如下:
using System;
using System.Collections.Generic;
namespace IPC.Base.Domain
{
public partial class MenuItem : …Run Code Online (Sandbox Code Playgroud) 我的应用程序具有以下实体:
public class User
{
public virtual int UserID { get; set; }
public virtual string UserName { get; set; }
public virtual IList<UserLog> Log { get; private set; }
public User()
{
Log = new List<UserLog>();
}
}
public class UserLog
{
public virtual int UserLogID { get; set; }
public virtual User User { get; set; }
public virtual string UserName { get; set; }
public virtual DateTime DateCreated { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
使用以下流畅的映射:
public class UserMap …Run Code Online (Sandbox Code Playgroud) 在NHibernate中有一种方法可以将计数查询的结果映射到类的属性吗?我想在XML映射中执行此操作.
我知道我可以通过代码(通过实际查询计数的构造,或通过作弊,执行完整查询,并计算结果项)来制定这个,但如果我可以编写一些简短的SQL或HQL,那将是很好的.以某种方式阻塞到我的XML映射中.
一个具体的例子.我的DB有这些表 -
Entry
Id
BodySummary
Comment
Id
EntryId
Body
Run Code Online (Sandbox Code Playgroud)
我想得到一些条目摘要.对于每个条目,我想获得评论计数(和正文摘要).
仅供参考:我省略了我的数据库中不相关的部分,如作者,条目标题/正文,时间戳等.这当然应该与我询问的查询部分无关.
我们正在迁移当前的C#应用程序以使用nHibernate.由于nHibernate提升了纯粹的域驱动设计,我们可以将业务对象添加为类的属性,或者应该继续使用ID.
让我用一个例子说明这一点;
参加以下现有课程.地址(和子项)仅由其ID标识.
public class Person
{
public int PersonID { get; set; }
public string FirstName { get; set; }
public string FirstName { get; set; }
public int AddressID { get; set; }
public List<int> ChildrenIDs { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我们将类转换为使用nHibernate时,我们还希望借此机会更改"Person"类的结构以更好地满足需求.希望nHibernate能够在"引擎盖下"处理所有数据检索
public class Person
{
public virtual int PersonID { get; private set; }
public virtual string FirstName { get; set; }
public virtual string FirstName { get; set; }
public virtual AddressObject Address { get; set; …Run Code Online (Sandbox Code Playgroud) 我有2个主表,它们通过地图表链接如下
User [UserId,Name]
Resource [ResourceId,Name]
UserResourceMap [UserId,ResourceId,AccessLevel]
Run Code Online (Sandbox Code Playgroud)
具有AccessLevel的Resource和User ClassMap如何作为资源属性?
我的Domain类看起来像这样
public class User
{
public virtual int UserId { get;protected set; }
public virtual string Name { get;set; }
}
public class Resource
{
public virtual int ResourceId { get;protected set; }
public virtual string Name { get;set; }
public virtual string AccessLevel { get;set; }//Issue-populate this using fluent
}
Run Code Online (Sandbox Code Playgroud)
如何在下面的代码中使用fluent映射accessLevel属性.
public class UserMap : ClassMap<User>
{
public UserMap()
{
Table("User");
Id(x => x.Key);
Map(x=>x.Name);
}
}
public class ResourceMap …Run Code Online (Sandbox Code Playgroud) 在流利的NH中有任何方式可以将[查看]映射到c#类吗?我需要让它们只读.
我试图通过代码使用NHibernate(v3.3)映射来获得自定义类型.我在这里尝试了这个例子,但没有运气.我想要实现的自定义类型是一个修剪来自数据库的字符串的类型.
我收到以下异常:
PropertyAccessException:无效的转换(检查映射是否存在属性类型不匹配).{"无法将'System.String'类型的对象强制转换为'ConsoleApplication1.TrimmedString'."}
这是我的全部尝试(要点).
public class TrimmedString : IUserType
{
public object NullSafeGet(IDataReader rs, string[] names, object owner)
{
//treat for the posibility of null values
string resultString = (string) NHibernateUtil.String.NullSafeGet(rs, names[0]);
if (resultString != null)
return resultString.Trim();
return null;
}
public void NullSafeSet(IDbCommand cmd, object value, int index)
{
if (value == null)
{
NHibernateUtil.String.NullSafeSet(cmd, null, index);
return;
}
value = ((string) value).Trim();
NHibernateUtil.String.NullSafeSet(cmd, value, index);
}
public object DeepCopy(object value)
{
if (value == …Run Code Online (Sandbox Code Playgroud) c# nhibernate nhibernate-mapping iusertype nhibernate-mapping-by-code