我正在使用Oracle中的遗留数据库,我的一些表中的列设置为NOT-NULL,我不想在我的域模型中使用,但是,显然,我需要在某处指定至少一些默认值保存到数据库(例如,Groups表可能有一个"Indentation"列,因为thaqt总是需要char(8)值).
我将如何在NHibernate中进行此操作?是否有捷径可寻?如果没有,有没有人知道我可以这样做的方式(我已经考虑过使用Inteceptor,但实际上不知道从哪里开始......).我无法更改数据库架构,所以这可能不是一个选项(流畅的版本也可以......).
我有以下地图.我的意图是order.BasketId映射到orderItem.BasketId.当我看到sql时,我看到它的映射顺序.Id to orderItem.BasketId.如何在我的订单映射中定义要针对basketId映射的订单属性.它似乎默认为主键.
<class name="Order" table="Orders">
<id name="Id" type="Int32" column="Order_ID" unsaved-value="0">
<generator class="identity"/>
</id>
<property name="BasketId" column="Basket_ID" type="Int32"/>
<set name="OrderItems" table="item_basket_contents" generic="true" inverse="true" >
<key column="Basket_ID" />
<one-to-many class="EStore.Domain.Model.OrderItem, EStore.Domain"/>
</set>
</class>
Run Code Online (Sandbox Code Playgroud)
和orderItem
<class name="OrderItem" table="Item_Basket_Contents">
<id name="Id" type="Int32" column="ID" unsaved-value="0">
<generator class="identity"/>
</id>
<property name="BasketId" column="Basket_ID" type="Int32"/>
</class>
Run Code Online (Sandbox Code Playgroud) 我的存储库中有以下方法.这工作正常,我的orderItems按预期初始化,但orderItems包含另一个名为OrderItemAddress的集合.这些都没有初始化.我该怎么办?
public Model.Order Get(int id)
{
using (ISession session = NHibernateHelper.OpenSession())
{
Model.Order order = session
.CreateCriteria(typeof(Model.Order))
.Add(Restrictions.Eq("Id", id))
.UniqueResult<Model.Order>();
NHibernateUtil.Initialize(order.OrderItems);
return order;
}
}
Run Code Online (Sandbox Code Playgroud) 我有以下课程
public class Contact
{
public Contact() {
Addresses = new List<Address>();
EmailAddresses = new List<EmailAddress>();
PhoneNumbers = new List<PhoneNumber>();
}
public virtual int ContactID { get; private set; }
public virtual Firm Firm { get; set; }
public virtual ContactType ContactType { get; set; }
public virtual string FullName { get; set; }
public virtual string FiscalCode { get; set; }
public virtual string Notes { get; set; }
public virtual ContactRole ContactRole { get; set; }
public virtual …Run Code Online (Sandbox Code Playgroud) 我们的系统上有用户和人员。每个用户有很多人。但是当用户登录时,我们需要查找他的主要人员记录以填写他的姓名、地址、电话等。
public class Person
{
/// <summary>Every Person belongs to a user.</summary>
public virtual User User { get; set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual string Address { get; set; }
public virtual string Phone { get; set; }
// More methods & Properties
}
public class User : Entity
{
public virtual string Username { get; set; }
public virtual string Password …Run Code Online (Sandbox Code Playgroud) 我有一个项目和一个人(有点简化):
public class Project
{
public virtual Person CreatedBy { get; set; }
}
public class Person
{
public virtual string Username { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我正在与NH Linq合作一个项目:
var projects = from p in session.Query<Project>()
select p;
var project = projects.First();
Run Code Online (Sandbox Code Playgroud)
有时使用Fetch()
var project = projects.Fetch(p => p.CreatedBy).First();
Run Code Online (Sandbox Code Playgroud)
现在,我怎样才能在一个单元测试验证project.CreatedBy 不是或被急切装载(和反向),这取决于如果取(),使用?在我的理解中,使用Fetch()应该急切加载Person,如果我不使用Fetch(),它应该延迟加载Person.
我试过了
Assert.IsTrue(NHibernateUtil.IsInitialized(project.CreatedBy));
Run Code Online (Sandbox Code Playgroud)
和
NHibernateUtil.IsPropertyInitialized(project, "CreatedBy")
Run Code Online (Sandbox Code Playgroud)
但是无论我是否使用Fetch(),它们都返回true.IsInitialized()适用于集合(一对多),例如Person.Projects,但不适用于多对一...
CreatedBy属性应该是延迟加载的,但有时我希望它被急切加载,我希望单元测试确认它正在按预期工作.
CreatedBy属性的映射是
<many-to-one name="CreatedBy" class="Person" fetch="select">
<column name="PERSON_ID" precision="10" scale="0" not-null="true" />
</many-to-one>
Run Code Online (Sandbox Code Playgroud)
我验证了这样的映射:
var to1 = NHibernateConfiguration.GetClassMapping(typeof(Project))
.ReferenceablePropertyIterator.FirstOrDefault(p => …Run Code Online (Sandbox Code Playgroud) 我看到围绕 NH Fluent 接口产生了很多嗡嗡声,那么使用 Fluent 而不是 XML 映射和 Criteria API 有什么好处?
我有以下内容:
Id(x => x.ID, m =>
{
m.Column("IDUSER");
m.Generator(Generators.Sequence);
});
Run Code Online (Sandbox Code Playgroud)
但是如何指定序列名称?
好吧,我用谷歌搜索了很多,发现了相同的建议(将 hbm 设置为嵌入式资源,在 hibernate.cfg 中添加 hbm 等),尽管如此,我仍然不明白。
让我解释一下:我为检票口设备编写了一个通信 Dll,其中有一个配置模型类,我用它通过 TCP/IP 配置该设备。但现在,我必须将这个对象持久保存在数据库上,因此我在模型中编写了一个适配器,将一个对象粘合到另一个对象上。这样,我就有了一个适用于我的配置模型的适配器,其中包含 ID、InclusionDate 等。让我们来看看:
DeviceConf 模型类:
public class DeviceConf : BaseModel // which have ID, IncludedDate, etc
{
private TGCommHelper.Entities.Configuration.TicketGateConfig _conf;
public TGCommHelper.Entities.Configuration.TicketGateConfig conf
{
get { return _conf; }
private set { _conf = value; }
}
public DeviceConf()
{
conf = new TGCommHelper.Entities.Configuration.TicketGateConfig();
}
public DeviceConf(TGCommHelper.Entities.Configuration.TicketGateConfig config){
conf = config;
}
public virtual string IP
{
get { return conf.IP; }
set { conf.IP = value; }
}
public …Run Code Online (Sandbox Code Playgroud) 我有一个在 XML 中映射的父/子关系。一个 Booking 可以有很多付款,所以我的 Booking 模型有一个 IList Payments {get;set;} 属性,我将它映射到 XML 中,如下所示:
<bag name="Payments" inverse="true">
<key column="BookingId"/>
<one-to-many class="Payment, NHibernateOneToMany"/>
</bag>
Run Code Online (Sandbox Code Playgroud)
这很好用,但现在我需要引入软删除的概念,所以我在 Payment 中添加了一个 Deleted bool 列,我希望 Payments on Booking 只包含未删除的,所以我想做像这样:
<bag name="Payments" inverse="true">
<key column="BookingId"/>
<one-to-many class="Payment, NHibernateOneToMany"/>
<sql>SELECT * FROM Payment WHERE Deleted = 0 AND BookingId = bookingId</sql>
</bag>
Run Code Online (Sandbox Code Playgroud)
我已经研究过使用过滤器,但它们似乎只提供在启用的情况下使用过滤器的能力 - 我希望这个属性每次都排除所有已删除的项目,这样就不会出现错误。
实现这一目标的最佳方法是什么?