是否可以使用Fluent Nhibernate将枚举映射为字符串?
我有两个双向一对多关系的实体:
public class Storage
{
public IList<Box> Boxes { get; set; }
}
public class Box
{
public Storage CurrentStorage { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
和映射:
<class name="Storage">
<bag name="Boxes" cascade="all-delete-orphan" inverse="true">
<key column="Storage_Id" />
<one-to-many class="Box" />
</bag>
</class>
<class name="Box">
<many-to-one name="CurrentStorage" column="Storage_Id" />
</class>
Run Code Online (Sandbox Code Playgroud)
A Storage可以有很多Boxes,但Box只能属于一个Storage.我将它们映射,以便一对多有一个级联all-delete-orphan.
当我尝试更换Box时,我的问题就出现了Storage.假设我已经运行了这段代码:
var storage1 = new Storage();
var storage2 = new Storage();
storage1.Boxes.Add(new Box());
Session.Create(storage1);
Session.Create(storage2);
Run Code Online (Sandbox Code Playgroud)
以下代码将给我一个例外:
// get the first …Run Code Online (Sandbox Code Playgroud) 考虑以下Hibernate映射文件:
<hibernate-mapping ...>
<class name="ContentPackage" table="contentPackages">
<id name="Id" column="id" type="int"><generator class="native" /></id>
...
<bag name="Clips" table="contentAudVidLinks">
<key column="fk_contentPackageId"></key>
<many-to-many class="Clip" column="fk_AudVidId"></many-to-many>
<filter name="effectiveDate" condition=":asOfDate BETWEEN startDate and endDate" />
</bag>
</class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)
当我运行以下命令时:
_session.EnableFilter("effectiveDate").SetParameter("asOfDate", DateTime.Today);
IList<ContentPackage> items = _session.CreateCriteria(typeof(ContentPackage))
.Add(Restrictions.Eq("Id", id))
.List<ContentPackage>();
Run Code Online (Sandbox Code Playgroud)
生成的SQL在中间映射表(contentAudVidLinks)上有WHERE子句,而不是"Clips"表,即使我已将过滤器属性添加到Bag of Clips中.
我究竟做错了什么?
虽然这是一个主观问题,但作为一个新的NHibernate用户,我很好奇为什么会选择Fluent与传统的XML映射.
从我的观点来看,当我第一次使用NHibernate时,我使用了Fluent界面,但遇到了一些障碍,很难找到适合Fluent界面的文档,除了"玩具应用程序"之外,所以我学会了处理这些XML.
随着时间的推移,我意识到我在XML方面完成了大部分工作,并意识到它并不像我想象的那样可怕.所以对我个人来说,这是一个文档很差的情况,并没有看到编码时间的显着节省.
话虽如此,我可能会有一些巨大的优势/劣势,我很想听到那些在使用这些工具方面有更多经验的人的意见.
我有以下映射:
public class SecurityMap : ClassMap<Security>
{
public SecurityMap()
{
Table("Security");
CompositeId().KeyProperty(k => k.Id, "SecurityId").KeyProperty(k => k.EndDate);
Map(x => x.LastUpdateUser);
References(x => x.Company).Columns("CompanyId", "EndDate");
References(x => x.PrimaryListing).Columns("PrimaryListingId", "EndDate");
}
}
public class ListingMap : ClassMap<Listing>
{
public ListingMap()
{
Table("Listing");
CompositeId().KeyProperty(k => k.Id, "ListingID").KeyProperty(k => k.EndDate);
References(x => x.Security).Columns("SecurityId","EndDate");
}
}
public class CompanyMap : ClassMap<Company>
{
public CompanyMap()
{
Table("Company");
CompositeId().KeyProperty(k => k.Id, "CompanyID").KeyProperty(k => k.EndDate);
HasMany(x => x.Securities).KeyColumns.Add("CompanyId", "EndDate");
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试运行此测试时:
[Test]
public void can_update_a_security()
{
var …Run Code Online (Sandbox Code Playgroud) mapping nhibernate exception nhibernate-mapping fluent-nhibernate
我是NHibernate的新手所以到目前为止对映射等的接触有限,而且我刚刚遇到了一个我需要一些帮助的场景.
我有2张桌子:
评论TaggedReviews
我有2个看起来像这样的类(为简洁起见,我排除了非重要属性):
public virtual int ReviewId { get; set; }
public virtual TaggedReview TaggedReview { get; set; }
public virtual string Title { get; set; }
public virtual string Descrip { get; set; }
Run Code Online (Sandbox Code Playgroud)
public virtual int ReviewId { get; set; }
public virtual Review Review { get; set; }
public virtual string TaggedReviewDescrip { get; set; }
Run Code Online (Sandbox Code Playgroud)
我的NHibernate这些表/类的XML映射文件目前如下(为简洁起见编辑):
<class xmlns="urn:nhibernate-mapping-2.2" name="Review" table="Reviews">
<id name="ReviewId" unsaved-value="0">
<column name="ReviewId"></column>
<generator class="native" />
</id>
<property name="Title" not-null="true" …Run Code Online (Sandbox Code Playgroud) 我们有POCO,类似于:
public class Person
{
public Guid PersonID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime DateOfBirth { get; set; }
public string Version {get; set; }
}
Run Code Online (Sandbox Code Playgroud)
和相应的hbm文件一样
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernate.FirstAttempt" namespace="NHibernate.FirstAttempt.Entity" >
<class name="Person" lazy="false">
<id name="PersonID">
<generator class="guid" />
</id>
<property name="FirstName" />
<property name="LastName" />
<property name="DateOfBirth" />
</class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)
仔细观察,我们有一个Version属性,数据库中没有列?我们只是希望nHibernate忽略这个属性,这就是我们没有将属性放在映射文件中的原因.但相反,它开始抛出错误.
有没有解决的办法 ?
我正在为一个项目设置NHibernate,我有一些查询,由于它们的复杂性,我们将作为存储过程离开.我希望能够使用NHibernate来调用sprocs,但遇到了一个我无法弄清楚的错误.由于我正在使用Fluent NHibernate,我正在使用此处推荐的混合模式映射.但是,当我运行应用程序时,我得到一个"命名查询未知:AccountsGetSingle"异常,我无法弄清楚原因.我想我的HBM映射可能有问题,因为我对使用它们并不是很熟悉,但我不确定.
我的NHibernate配置代码是:
private ISessionFactory CreateSessionFactory()
{
return Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2005
.ConnectionString((conn => conn.FromConnectionStringWithKey("CIDB")))
.ShowSql())
.Mappings(m =>
{
m.HbmMappings.AddFromAssemblyOf<Account>();
m.FluentMappings.AddFromAssemblyOf<Account>();
})
.BuildSessionFactory();
}
Run Code Online (Sandbox Code Playgroud)
我的hbm.xml文件是:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<sql-query name="AccountsGetSingle">
<return alias="Account" class="Core, Account"></return>
exec AccountsGetSingle
</sql-query>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)
我调用sproc的代码如下所示:
public Account Get()
{
return _conversation.Session
.GetNamedQuery("AccountsGetSingle")
.UniqueResult<Account>();
}
Run Code Online (Sandbox Code Playgroud)
任何想法或想法将不胜感激.谢谢.
更新: @kibbled_bits的建议让我得到我正在寻找的最终结果(能够从NHibernate调用存储过程),但我仍然不知道为什么我上面列出的方法不起作用.我仍然很好奇为什么,因为它可以为未来的问题提供有价值的见解.
使用流畅的nhibernate和自动化(nhibernate创建我的数据库模式),我怎样才能获得nhibernate在数据库中基于以下类创建一个nvarchar(max)列
public class VirtualPage : BaseEntity
{
public virtual int ParentId { get; set; }
public virtual string PageName { get; set; }
public virtual string Title { get; set; }
public virtual string Body { get; set; }
public virtual string ViewName { get; set; }
public virtual string ViewData { get; set; } // this must be nvarchar(max)
}
Run Code Online (Sandbox Code Playgroud) 我有一个问题,NHibernate查询数据库的方式太多次了.我刚刚意识到它可能与n + 1问题有关,但我无法弄清楚如何改变我的映射来解决问题.
正如您将看到的,我的尝试涉及指定不延迟加载其他对象,但它似乎没有做到这一点.
这是查询:
public IQueryable<Report> ReadAll(DateTime since)
{
return m_session.QueryOver<Report>()
.JoinQueryOver(r => r.Mail)
.Where(m => m.Received >= since)
.List()
.AsQueryable();
}
Run Code Online (Sandbox Code Playgroud)
在此先感谢您的回复!如果您需要有关我的对象或映射的更多信息,请告诉我们.
简化对象图(一些省略):
public class Report : EntityBase
{
public virtual Product Product { get; set; }
public virtual StackTrace StackTrace { get; set; }
public virtual Mail Mail { get; set; }
public virtual IList<ClientUser> ReadBy { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
-
public class Product : EntityBase
{
public virtual string Name { get; set; }
public …Run Code Online (Sandbox Code Playgroud)