1

我有以下情况......

  • 海量微ORM
  • .NET 框架 4.0
  • SQL Server 2008R2

模型:

public class sUser : DynamicModel
{
    public sUser() : base(Model.strConnection, "Users", "UserId") { }
}

public class Test
    {
        public void UpdateUser(string user)
        {
            dynamic User = GetUser(user);

            //Dynamically generated User object has many columns
            // I Update following fields...
            User.Address1 = "123 Main Street";
            User.Address2 = "Suite# 456";
            User.CityName = "Princeton";
            User.State = "NJ";
            User.Zipcode = "08540";
            //And update some more fields in Users object

           //I could do this...
            //var upd = new { Address1 = "123 Main Street", Address2 = "Suite# 456", ...};
            //User.Update(upd, User.UserID);

            //But would like to pass entire object, so I do not have to form all updated name/value in the update statement
            User.Update(User, User.UserID);

            //But Users table has a column with IDENTITY SEED,
            //And if I pass entire object for update it errors out
            //Cannot update identity column 'RefNo'
        }

        public dynamic GetUser(string userName)
        { 
            dynamic table = new sUser();
            var objUser = table.First(UserName: userName);

            return objUser;
        }
    }

用户表有一个 RefNo 列IDENTITY SEED=1,当我更新整个用户对象时,它会出错,无法更新标识列“RefNo”。我想传递整个对象进行更新,而不是形成长更新语句。

我该如何处理?

谢谢。

4

2 回答 2

1

如果您的 Users 表有一列RefNo带有IDENTITY SEED = 1,那么这意味着它是您的主键。在您sUser的班级中,您正在调用基本构造函数:

base(Model.strConnection, "Users", "UserId")

这个调用告诉 Massive 主键列是UserId- 如果你改为传递它会发生什么RefNo

编辑:

我想我看到了您遇到的问题:Massive 将生成一个更新语句,其中包括您对象的所有属性,包括RefNo. 由于数据库正在处理此列(通过IDENTITY SEED),因此您无法修改或设置此值。

相反,我建议利用UserExpandoObject. 你可以做的是:

((IDictionary<string, object>)User).Remove("RefNo");
User.Update(User, User.UserID);

这将做的是RefNo从对象中删除属性,这意味着它不会包含在创建的更新语句中,这反过来会导致Update调用成功。

于 2012-11-17T09:47:53.313 回答
0

修改 Massive.cs - 在DynamicModel类 下添加以下内容

private string IdentityColumn { get; set; }

 private string GetIdentityColumn()
 {
    return (string)Scalar("SELECT C.name AS IdentityColumn FROM sys.columns C Inner Join sys.tables T ON T.object_id = C.object_id WHERE C.is_identity = 1 And T.name = '" + TableName + "'");
 }

并在CreateUpdateCommand方法下添加以下...

IdentityColumn = GetIdentityColumn();

并在foreach循环下将if 语句修改为以下...

if (!item.Key.Equals(PrimaryKeyField, StringComparison.OrdinalIgnoreCase) && item.Value != null && item.Key != IdentityColumn)

以上更改为 Massive 库将允许我们使用标识列更新模型。限制:适用于具有一个 IDENTITY 列的表。

于 2012-11-19T00:08:47.267 回答