Сопоставление компонентов NHibernate: конфликт типов операндов: bigint несовместим со временем

Я пишу приложение, которое использует отображение NHibernate по коду. Когда у меня есть TimeSpan, отображаемый как свойство объекта, TimeSpan отображается правильно.

Однако, если я помещаю TimeSpan в сопоставление компонента (объект значения), я получаю исключение en "Конфликт типов операндов: bigint несовместим со временем" - даже если я сопоставляю TimeSpan с помощью сопоставления TimeSpan.

Следующий код правильно сохранит временной интервал (например, «1753-01-01T08:00:00»)

public class MyEntity
{
    public virtual int Id { get; protected set; }
    public virtual ISet<AnotherEntity> OtherEntities { get; protected set; }
}

public class AnotherEntity
{
    public virtual int Id { get; protected set; }
    public virtual TimeSpan MyTimeSpan { get; protected set; }
}

public class MyEntityMap : ClassMapping<MyEntity>
{
    public MyEntityMap()
    {
        Table("MyEntityTable");
        Id(x => x.Id, map =>
        {
            map.Column("Id");
        });

        Set(x => x.OtherEntities, c =>
        {
            c.Table("OtherEntityTable");
            c.Inverse(true);
            c.Key(k => k.Column("MyEntityId"));
        }, r => r.OneToMany(m =>
        {
            m.NotFound(NotFoundMode.Exception);
            m.Class(typeof(AnotherEntity));
        }));
    }
}

public class AnotherEntityMap : ClassMapping<AnotherEntity>
{
    public AnotherEntityMap()
    {
        Table("AnotherEntityTable");

        Id(x => x.Id, map =>
        {
            map.Column("AnotherEntityId");
        });

        Property(x => x.MyTimeSpan, m => m.Type<TimeAsTimeSpanType>());
    }
}

Однако следующий код попытается сохранить TimeSpan как целое число (например, 288000000000) и выдаст исключение. (Аналогичным образом возникает исключение, когда он пытается гидратировать вложенный объект-значение.)

public class MyEntity
{
    public virtual int Id { get; protected set; }
    public virtual MyValueObject MyValueObject { get; protected set; }
}

public class MyValueObject
{
    public virtual ISet<NestedValueObject> NestedValueObjects { get; protected set; }
}

public class NestedValueObject
{
    public virtual TimeSpan MyTimeSpan { get; protected set; }
}

public class MyEntityMap : ClassMapping<MyEntity>
{
    public MyEntityMap()
    {
        Table("MyEntityTable");
        Id(x => x.Id, map =>
        {
            map.Column("Id");
        });

        Component(x => x.MyValueObject, c =>
        {
            c.Set(x => x.NestedValueObjects, map =>
            {
                map.Table("NestedValueObjects");
                map.Key(k => k.Column("MyEntityId"));
            }, r => r.Component(n =>
            {
                n.Property(x => x.MyTimeSpan, m => m.Type<TimeAsTimeSpanType>());
            }));
        });
    }
}

Что-то не так с отображениями? Или есть ошибка с отображением NHibernate по коду?


person RiddleMeThis    schedule 16.06.2017    source источник


Ответы (1)


Я предполагаю, что это ошибка с отображением NHibernate по коду, и возникла ошибка NH-4038. .

person RiddleMeThis    schedule 23.06.2017
comment
На самом деле это дубликат NH-3913, разрешенный в текущем мастере, но еще не выпущенный. - person Frédéric; 10.07.2017
comment
Было ли это частью той же проблемы? В NH-3913 вы не можете сопоставлять непубличные свойства из-за отсутствующей подписи метода, о которой я ранее спрашивал здесь: stackoverflow.com/questions/44636469/ В приведенной выше проблеме я пытался сопоставить общедоступное свойство, но оно сохраняло свойство как BIGINT, а не как TimeSpan. - person RiddleMeThis; 12.07.2017