Свободное отображение NHibernate IDictionary разумным способом

Учитывая эти классы:

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 () , Мои варианты - это имя хоста, имя веб-приложения или имя используемой платформы. Мне все это не нравится. Это ...

    У меня есть веб-приложение pylons, и сейчас я выбираю хорошее имя пользователя для базы данных. Мои варианты - это имя хоста, имя веб-приложения или имя используемой платформы. Мне все это не нравится.

    Есть ли какое-то соглашение для именования пользователей базы данных?

6
задан TheOne 30 December 2010 в 16:16
поделиться