Используя NHibernate ICompositeUserType с типом значения

Я никогда не находил простой способ преобразовать от Хранилища до svn. В основном мы взяли наши последние ответвления и соединительную линию и запустились новый в svn. Честно я пошел две или три маркировки назад, просто так. Я имел в наличии дб хранилища в течение шести месяцев, и мы никогда не должны были возвращаться к нему для данных. Таким образом, я предполагаю, что Вы хотите продвинуть свою историю для принудительного ассортимента средства отслеживания ошибки; в это то же время мы передали наш выдающийся список ошибки новому средству отслеживания, так, чтобы определенно сделанные более удобные вещи. Если мы, где, оставаясь с тем же средством отслеживания ошибки, я думал бы, что мы будем запущенных новый экземпляр его для нового repo.Удачи!

Brett

9
задан Jon Seigel 27 February 2010 в 03:53
поделиться

3 ответа

Make the user type immutable by returning false in IsMutable and just throw an exception in SetPropertyValue.

I have something similar, but with an own datatype instead of DateTimeOffset. I just adapted the code for you. It stores the date as UTC time and the offset as TimeSpan (stores Ticks. Of course you don't need this resolution. But, you should not store whole hours for time zones, there are time zones offsets with fractions of hours!! And TimeSpan is build in an works out of the box.)

public class DateTimeOffsetUserType : ICompositeUserType
{
    public bool IsMutable
    {
        get { return false; }
    }

    public void SetPropertyValue(object component, int property, object value)
    {
        throw new InvalidOperationException("Immutable, SetPropertyValue is not allowed");
    }

    public object NullSafeGet(System.Data.IDataReader dr, string[] names, NHibernate.Engine.ISessionImplementor session, object owner)
    {
        if (dr == null)
        {
            return null;
        }

        DateTime? utcTime;
        TimeSpan? offset;

        utcTime = (DateTime?)PropertyTypes[0].NullSafeGet(dr, names[0], session, owner);
        offset = (TimeSpan?)PropertyTypes[1].NullSafeGet(dr, names[1], session, owner);

        if (utcTime == null || offset == null) return null;
        return new DateTimeOffset(utcTime.Value, offset.Value);
    }

    public void NullSafeSet(System.Data.IDbCommand cmd, object value, int index, NHibernate.Engine.ISessionImplementor session)
    {
        if (value == null)
        {
            NHibernateUtil.Timestamp.NullSafeSet(cmd, null, index);
            NHibernateUtil.TimeSpan.NullSafeSet(cmd, null, index + 1);
        }
        else
        {
            DateTimeOffset dateTimeOffset = (DateTimeOffset)value;

            PropertyTypes[0].NullSafeSet(cmd, dateTimeOffset.UtcDateTime, index, session);
            PropertyTypes[1].NullSafeSet(cmd, dateTimeOffset.Offset, index + 1, session);
        }

    }

    // other methods
6
ответ дан 4 December 2019 в 22:29
поделиться
public void SetPropertyValue(object component, int property, object value)

У меня есть код, который реализует DateTime из двух полей типа int.

Код, по сути, представляет собой свойство переключения (0 - дата, 1 - время, в моем случае) и в конце каждый оператор case объект компонента переназначает новый экземпляр DateTime.

property = 0 (Date):

// code to calculate year, month, day from object value
DateTime dt = (DateTime)component;
dt = new DateTime(year, month, day, dt.Hour, dt.Minute, dt.Second);

property = 1 (Time):

// code to calculate hours, minutes, seconds from object value
DateTime dt = (DateTime)component;
dt = new DateTime(dt.Year, dt.Month, dt.Day, hours, minutes, seconds);

Не знаю, хорошо это или плохо, но у меня это работает (иначе говоря, у меня нет проблем с изменением того, на какой компонент указывает ссылка или нет).

0
ответ дан 4 December 2019 в 22:29
поделиться

Насколько я понимаю, если тип, с которым вы сопоставляете, и ICompositeUserType неизменяемый, SetPropertyValue () вообще ничего не должен делать или даже вызывать исключение, поскольку nhibernate не должен его вызывать .

2
ответ дан 4 December 2019 в 22:29
поделиться