代码之家  ›  专栏  ›  技术社区  ›  Stef Heyenrath Dariusz Woźniak

RIA服务+实体框架4+POCO's:'The Timestamp field is required'错误?

  •  3
  • Stef Heyenrath Dariusz Woźniak  · 技术社区  · 14 年前

    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属性 时间戳

    alt text

    我使用t4模板自动生成POCO实体。

    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;
        }
    
        ...
    }
    

    在ObjectContext上执行“SaveChanges”操作时,我得到一个用户实体的验证错误,该实体称为: 时间戳字段是必需的

    2 回复  |  直到 5 年前
        1
  •  2
  •   Stef Heyenrath Dariusz Woźniak    14 年前

    解决方案:

    我已将T4生成的用户类更改为:

    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;
        }
    
        ...
    }
    

    我还添加了一个通用的元数据类,它被排除 时间戳 属性:

    /// <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; }
    }
    

    这就解决了问题。

        2
  •  0
  •   Jozef Benikovský    9 年前

    一个选择是设置 Nullable true 在EDMX模型中,但保持 NOT NULL 数据库中的约束。

    作为生成的类型 Timestamp ( RowVersion )是引用类型( byte[] null 值,则不应破坏任何现有代码。