Mar*_*ski 5 nhibernate nhibernate-mapping fluent-nhibernate
鉴于这些类:
using System.Collections.Generic;
namespace FluentMappingsQuestion
{
    public class Entity
    {
        public virtual int Id { get; set; }
        public virtual IDictionary<string, Property> Properties { get; set; }
    }
    public class Property
    {
        public virtual Entity OwningEntity { get; set; }
        public virtual string Name { get; set; }
        public virtual int Value { get; set; }
        public virtual decimal OtherValue { get; set; }
    }
}
如何使用NHibernate(最好是流利的味道)映射它们,以便这样做:
[Test]
public void EntityPropertyMappingTest()
{
    using (var session = _factory.OpenSession())
    {
        var entity = new Entity();
        // (#1) I would *really* like to use this
        entity.Properties["foo"] = new Property { Value = 42, OtherValue = 42.0M };
        session.Save(entity);
        session.Flush();
        // (#2) I would like the entity below to "update itself"
        // on .Save or .Flush. I got it to work with .Load()
        Assert.AreEqual(42, entity.Properties["foo"].Value);
        Assert.AreEqual(42.0M, entity.Properties["foo"].OtherValue);
        Assert.AreEqual("foo", entity.Properties["foo"].Name);
        Assert.AreEqual(entity, entity.Properties["foo"].Owner);
    }
}
我几乎设法用这些映射来做到这一点:
// class EntityMap : ClassMap<Entity>
public EntityMap()
{
    Id(x => x.Id);
    HasMany(x => x.Properties)
    .Cascade.AllDeleteOrphan()
    .KeyColumn("EntityId")
    .AsMap(x => x.Name);
}
// class PropertyMap : ClassMap<Property>
public PropertyMap()
{
    Id(x => x.Id);
    References(x => x.OwningEntity).Column("EntityId");
    Map(x => x.Name).Length(32);
    Map(x => x.Value);
{
我遇到的问题:
Entity.Properties .Inverse(),它开始打破.Inverse()那么NHibernate会:INSERT(Entity), INSERT(Property), UPDATE(Property)而不仅仅是INSERT(Entity), INSERT(Property)Property.Name .Not.Nullable(),它开始打破.Not.Nullable(),我的数据库架构中就有一个漏洞我该如何更改映射?
我通过指定此映射来解决这个问题:
HasMany<Property>(Reveal.Member<Entity>("InternalProperties"))
  .AsMap(p => p.Name)
  .Cascade.AllDeleteOrphan()
  .Inverse();
IDictionary<string, Property>并创建两个类型为:Properties和 的属性InternalProperties。第一个是第二个之上的代理字典,用于设置条目的OwningEntity和Name属性Property。
| 归档时间: | 
 | 
| 查看次数: | 303 次 | 
| 最近记录: |