【问题标题】:ServiceStack ORMLite Cannot Update Identity ColumnServiceStack ORMLite 无法更新标识列
【发布时间】:2013-10-09 16:20:04
【问题描述】:

我正在使用 ServiceStack ORMLite 来尝试更新我的数据库中的记录。我所有的 POCO 都实现了一个 IHasID 接口

public interface IHasId
{
    int Id { get; set; }
}

在我的 POCO 中,我有以下属性

private int id;

[ServiceStack.DataAnnotations.Alias("TableName_ID")]
    public int Id
    {
        get { return id; }
        set
        {
            if (value != this.id)
            {
                this.id = value;                    
                NotifyPropertyChanged("Id");
            }
        }
    }

我的每个存储库类都从具有以下方法的 DataRepositoryBase 类继承:

public virtual T Update(T entity)
    {
        using (IDbConnection db = CreateDbConnection())
        {
            db.Update<T>(entity, e => e.Id == entity.Id);
            return entity;
        }
    }

当我在子存储库上调用此方法时,我收到以下错误:

System.Data.SqlClient.SqlException (0x80131904):无法更新标识列“TableName_ID”。

我该如何解决这个错误?

我做错了什么?

谢谢!

杰里米

【问题讨论】:

    标签: c# servicestack ormlite-servicestack


    【解决方案1】:

    您还应该使用[AutoIncrement] 标记身份列,例如:

    [AutoIncrement]
    [Alias("TableName_ID")]
    public int Id { ... ]
    

    【讨论】:

    • 另外,在不添加 [AutoIncrement] 数据注释的情况下,我将更新方法更改为:db.Update(entity);这也有效。谢谢!
    【解决方案2】:

    您通常不会更新身份字段,因为它们是由数据库自动生成的。在某些特定情况下,您可能希望更新标识字段,但您需要使用 SQL 执行此操作,因为它要求您在每个查询的开头和结尾使用 SET 语句。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多