RIA Services + Entity Framework 4 + POCO: ошибка «Поле временной метки обязательно»? - PullRequest
3 голосов
/ 15 августа 2010

У меня есть следующее определение таблицы в MSSQL:

CREATE TABLE [User] ( 
    [Id] bigint identity(1,1)  NOT NULL,
    [Email] nvarchar(256),
    [PasswordHash] nvarchar(128) NOT NULL,
    [PasswordFormat] int DEFAULT ((0)) NOT NULL,
    [PasswordSalt] nvarchar(10) NOT NULL,
    [Timestamp] timestamp
)
;

Свойство EDMX для Отметка времени выглядит следующим образом: (Обратите внимание, что я вручную изменил только красное свойство)

альтернативный текст http://i35.tinypic.com/2ez7g9k.png

Я использовал шаблон t4 для автоматической генерации объектов POCO.Сущность User выглядит следующим образом:

public partial class User : IEntity
{
    public virtual long Id
    {
        get;
        set;
    }
    ...

    [TimestampAttribute]
    [ConcurrencyCheck]
    [SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays", Justification = "Autogenerated by T4.")]
    public virtual byte[] Timestamp
    {
        get;
        set;
    }

    ...
}

При выполнении операции SaveChanges над ObjectContext я получаю ошибку проверки для сущности User, которая называется: Требуется поле Timestamp

Ответы [ 2 ]

2 голосов
/ 16 августа 2010

Решение:

Я изменил сгенерированный пользователем класс T4 на: (убрал атрибут 'ConcurrencyCheck')

public partial class User : IEntity
{
    public virtual long Id
    {
        get;
        set;
    }
    ...

    [TimestampAttribute]
    [SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays", Justification = "Autogenerated by T4.")]
    public virtual byte[] Timestamp
    {
        get;
        set;
    }

    ...
}

И я добавил общий класс метаданных, который используется всеми сущностями, за исключением свойства Timestamp :

/// <summary>
/// A MetaData which defines some default metadata for an Entity
/// </summary>
public class EntityMetaData
{
    /// <summary>
    /// Initializes a new instance of the <see cref="EntityMetaData"/> class.
    /// </summary>
    protected EntityMetaData()
    {
    }

    /// <summary>
    /// Gets or sets the timestamp.
    /// Note : this field is excluded on the client.
    /// </summary>
    /// <value>The timestamp.</value>
    [Exclude]
    public byte[] Timestamp { get; set; }
}

Это решает проблему.

0 голосов
/ 14 сентября 2015

Один из вариантов - установить атрибут Nullable на true в модели EDMX, но сохранить ограничение NOT NULL в базе данных.

Поскольку сгенерированный тип для Timestamp (RowVersion) является ссылочным типом (byte[]) и, следовательно, может принимать значение null, он не должен нарушать какой-либо существующий код.

...