Frage

Meine Datenbanktabelle ist so

CREATE TABLE MYBUDGET.tbl_CurrentProperty
(
    [PropID]            INT             NOT NULL  IDENTITY(1,1),
    [UpdatedOn]         DATETIME        NOT NULL,
    [Amount]            MONEY           NOT NULL,
    [Remarks]           VARCHAR(100)    NOT NULL,
)
ALTER TABLE MYBUDGET.tbl_CurrentProperty ADD CONSTRAINT PK_CurrentProperty_PropID PRIMARY KEY ([PropID])
ALTER TABLE MYBUDGET.tbl_CurrentProperty ADD CONSTRAINT DF_CurrentProperty_UpdatedOn DEFAULT (DATEADD(MINUTE,30,DATEADD(HOUR, 5, GETUTCDATE()))) FOR [UpdatedOn]
ALTER TABLE MYBUDGET.tbl_CurrentProperty ADD CONSTRAINT CK_CurrentProperty_Amount CHECK([Amount] > -1)
GO

Ich benutze Linq nach SQL. In C# muss ich nur [Betrag] und [Bemerkungen] Felder und andere Felder übergeben, mit ihren Standardwerten ([Propid] und [aktualisiert]).

In C# erstelle ich TBL_CurrentProperties -Objekt wie unten, wie unten,

tbl_CurrentProperties currentProperties = new tbl_CurrentProperties();
currentProperties.Amount = 50.00M;
currentProperties.Remarks = "remarks";

und senden Sie dann das Objekt in den Datenkontext. Aber hier hat Linq zugewiesen '1/1/0001 12:00:00 AM' für aktualisiertes Feld. Dies verletzt jedoch den SQL DateTime -Bereich 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM und eine Ausnahme auftreten. Ich kann auch keinen Nullwert manuell für a zuweisen DateTime Feld, da es ein nicht nullierbarer Typ ist. Wie auch immer, ich muss dies machen, um seine Standardbeschränkung zu verwenden. Wie mache ich das?


PS: Ich möchte es so verwenden, weil meine Datenbank online ist und Benutzer an verschiedenen Orten sind. Wenn ich also datetime.now verwendet habe, ist die Zeit in der Benutzermaschine möglicherweise falsch und fügt einen falschen Wert in DB ein. Ich muss immer die SQL Server -Zeit verwenden.

War es hilfreich?

Lösung

Andrey's Antworten ist teilweise richtig. Ich habe das gerade getestet und hier ist, was ich gefunden habe.

In Ihrem DBML -Designer auf Ihrem UpdatedOn Die Spalte setzen Folgendes:

Auto Generated Value = True 
Nullable = False

Dann auf einem INSERT wenn du benutzt SQL Server -Profiler Um das generierte SQL zu betrachten, werden Sie das sehen UpdatedOn ist Nicht im Einsatz enthalten. Nicht einmal ein Nullwert. Dies ist wichtig: Damit SQL Server einen Standardwert für dieses Kolum verwenden kann, ist die Spalte muss weggelassen werden von dem INSERT. Wenn Sie einstellen Nullable = True auf der UpdatedOn, Linq zu SQL könnte die Spalte in die enthalten INSERT mit einem Nullwert.

Zu Ihrer Information, unmittelbar danach INSERT Es sollte eine geben SELECT wobei LINQ zu SQL den automatisch generierten Wert abgerufen, sodass Ihr Entitätsobjekt den neuesten Wert hat.

Andere Tipps

Öffnen Sie Ihre DBML und aktivieren Sie "automatisch generierten Wert" = true für die automatischen Felder. Sie sollten alle gut sein, wenn Sie Nulls eingeben

Ich empfehle Ihnen, Ihre zu öffnen DBML Datei mit XML Editor und ändern Sie den Typ dieser Spalte von DateTime zu DateTime? Indem Nulls zuzulassen. Speichern Sie es und der Code wird für Sie generiert.

Wann immer LINQ to SQL erzeugt falsch DBML, Es ist besser, es selbst zu bearbeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top