1

次のようなSQLステートメントを生成しました。パラメータ@p1と@p2はまったく使用されておらず、必要ないことに注意してください。なんで来るの?どうすればそれらを削除できますか?

注:UpdateCheckは、すべての列に対してNeverです。

注:データベースは正しく更新されます。

問題

UPDATE [dbo].[BankAccount]
SET [Status] = @p3
WHERE [BankAccountID] = @p0
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [10000]
-- @p1: Input NChar (Size = 10; Prec = 0; Scale = 0) [Fixed     ]
-- @p2: Input NChar (Size = 10; Prec = 0; Scale = 0) [Savings   ]
-- @p3: Input NChar (Size = 10; Prec = 0; Scale = 0) [FrozenFA]

自動生成されたクラス

[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.BankAccount")]
[InheritanceMapping(Code = "Fixed", Type = typeof(FixedBankAccount), IsDefault = true)]
[InheritanceMapping(Code = "Savings", Type = typeof(SavingsBankAccount))]
public partial class BankAccount : INotifyPropertyChanging, INotifyPropertyChanged

テーブル

CREATE TABLE [dbo].[BankAccount](
[BankAccountID] [int] NOT NULL,
[AccountType] [nchar](10) NOT NULL,
[OpenedDate] [datetime] NULL,
[Status] [nchar](10) NULL,
[AccountOwnerID] [int] NULL,
CONSTRAINT [PK_BankAccount] PRIMARY KEY CLUSTERED 
(
[BankAccountID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

コード

public class LijosSimpleBankRepository : ILijosBankRepository
{
    public System.Data.Linq.DataContext Context
    {
        get;
        set;
    }


    public List<DBML_Project.BankAccount> GetAllAccountsForUser(int userID)
    {
        IQueryable<DBML_Project.BankAccount> queryResultEntities = Context.GetTable<DBML_Project.BankAccount>().Where(p => p.AccountOwnerID == userID);
        return queryResultEntities.ToList();
    }

    public List<T> GetAllAccountsofType<T>() where T : DBML_Project.BankAccount
    {
        var query = from p in Context.GetTable<DBML_Project.BankAccount>().OfType<T>()
                    select p;

        List<T> typeList = query.ToList();
        return typeList;

    }

    public virtual void UpdateAccount(DBML_Project.BankAccount bankAcc)
    {
        //UPDATE statement will be called only if there has happened a change
        Context.SubmitChanges();
    }

}



namespace ApplicationService_Bank
{
public class BankAccountAppService
{
    public RepositoryLayer.ILijosBankRepository AccountRepository { get; set; }

    public void FreezeAllAccountsForUser(int userId)
    {
        IEnumerable<DBML_Project.BankAccount> accounts = AccountRepository.GetAllAccountsForUser(userId);
        foreach (DBML_Project.BankAccount acc in accounts)
        {

            string getTypeResult = Convert.ToString(acc.GetType());



            acc.Freeze();
            AccountRepository.UpdateAccount(acc);
        }

    }

}


}
4

1 に答える 1

1

では、識別子の値をパラメーターとして含めていますか? おそらく、継承関連の更新でそれらを使用する場合がいくつかあります(おそらく同時実行チェックの一部として、それを無効にしたように見えますが)、その場合にそれらを無視するのは本当に難しく、価値がありませんでした必要のないところ、または単純にバグが入り込んだのです。いずれにせよ、クエリをほんの少し大きくすることを除いて、害はありません。気づくには足りない。

于 2012-07-03T06:38:28.357 に答える