Standardwerte (von C # -Variablen) Problem in LINQ to SQL Update
Ich habe den folgenden Code zum Aktualisieren der Kontentabelle mit LINQ to SQL. AccountNumber ist die Primärschlüsselspalte. Der einzige Wert, der aktualisiert werden muss, ist AccountType. Die Duration wird jedoch auch mit Null aktualisiert (Standardwert für int). Wie können wir dieses unnötige Überschreiben vermeiden?
Hinweis: Ich benutzeAnfügen Methode
Hinweis: Ich verstehe den Grund für dieses Verhalten. "Der DataContext kann nicht zwischen einem Feld mit dem zugewiesenen Wert Null und einem Feld ohne Zuordnung unterscheiden." Ich suche nach einer Lösung, um dies zu überwinden.
[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Duration", DbType="Int NOT NULL"
public int Duration
Tabelle DATA
Tabellenstruktur:
CREATE TABLE [dbo].[Account](
[AccountNumber] [int] NOT NULL,
[AccountType] [nchar](10) NOT NULL,
[Duration] [int] NOT NULL,
[DepositedAmount] [int] NULL,
CONSTRAINT [PK_Account] PRIMARY KEY CLUSTERED
(
[AccountNumber] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
CODE
public void UpdateAccount()
{
RepositoryLayer.Account acc1 = new RepositoryLayer.Account();
acc1.AccountNumber = 4;
acc1.AccountType = "Verify";
accountRepository.UpdateChangesByAttachAndRefresh(acc1);
accountRepository.SubmitChanges();
}
public virtual void UpdateChangesByAttachAndRefresh(T entity)
{
//Can GetOriginalEntityState cause any bug? Is it unnecessary?
if (GetTable().GetOriginalEntityState(entity) == null)
{
//If it is not already attached
Context.GetTable<T>().Attach(entity);
Context.Refresh(System.Data.Linq.RefreshMode.KeepCurrentValues, entity);
}
}
Generiertes SQL
UPDATE [dbo].[Account]
SET [AccountType] = @p3, [Duration] = @p4
WHERE ([AccountNumber] = @p0)
AND ([AccountType] = @p1)
AND ([Duration] = @p2)
AND ([DepositedAmount] IS NULL)
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [4]
-- @p1: Input NChar (Size = 10; Prec = 0; Scale = 0) [TEST ]
-- @p2: Input Int (Size = -1; Prec = 0; Scale = 0) [10]
-- @p3: Input NChar (Size = 10; Prec = 0; Scale = 0) [Verify]
-- @p4: Input Int (Size = -1; Prec = 0; Scale = 0) [0]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1
LESEN:
Wie kann ich eine Enum an einen DbType von Bit oder Int binden?
Linq to SQL: Warum erhalte ich IDENTITY_INSERT-Fehler?
LINQ to SQL: Aktualisierung ohne Aktualisierung bei "UpdateCheck = Never"