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、ユーザー オブジェクト全体を更新するとエラーが発生し、ID 列 'RefNo' を更新できません。長い更新ステートメントを作成するのではなく、更新のためにオブジェクト全体を渡したいと思います。

どうすればこれを処理できますか?

ありがとう。

4

2 に答える 2

1

Users テーブルに の列がある場合、RefNoそれIDENTITY SEED = 1は主キーであることを意味します。あなたsUserのクラスでは、次のように基本コンストラクターを呼び出しています。

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

この呼び出しは Massive に主キー列がUserId- 代わりに渡すとどうなるかをRefNo伝えています。

編集:

私はあなたが抱えている問題を見ていると思います.Massiveは、オブジェクトのすべてのプロパティを含む更新ステートメントを生成しますRefNo. データベースがこの列を ( 経由でIDENTITY SEED) 処理しているため、この値を変更または設定することはできません。

代わりに私が提案するのは、Userとして返されるという事実を利用することですExpandoObject。あなたができることはこれです:

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

これにより、オブジェクトからプロパティが削除さRefNoれます。つまり、作成される update ステートメントにプロパティが含まれないため、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 ライブラリへの変更により、ID 列を使用してモデルを更新できるようになります。制限: IDENTITY 列が 1 つのテーブルで機能します。

于 2012-11-19T00:08:47.267 に答える