Autor Beitrag
rittergig
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: So 03.07.11 13:17 
Ich entwickle mit:
Visual Studio 2010
C#/ .NET 4.0
Microsoft SQL Server 2008

Ich möchte Felder beim Einfügen eines neuen Datensatzes datenbankseitig automatisch setzten lassen (mit der DEFAULT-Klausel).
Ich kann mit Entity Framework aber keine Objekte mit NOT NULL DEFAULT-Eigenschaften erfolgreich einfügen.
Ich bekomme beim Versuch die Änderungen zu übernehmen (SaveChanges()) immer eine UpdateException.
Auch wenn ich im Modell für die entsprechenden Felder die Eigenschaft StoreGeneratedPattern auf Computed oder Identity stelle.


Mein Testszenario:

So habe ich die Tabelle angelegt:
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
CREATE TABLE [Tests]
(
  [IDX_Tests]        int          PRIMARY KEY IDENTITY,
  [Name]             nchar(256)    NOT NULL,
  [CreatedAt]        datetime      NOT NULL    DEFAULT CURRENT_TIMESTAMP,
  [CreatedBy]        nchar(256)    NOT NULL    DEFAULT 'Default User'
);


Im MyModel.edmx habe ich bei der Tabelle Test für die Felder "CreatedAt" und "CreatedBy" die Eigenschaft
Zitat:
StoreGeneratedPattern = Computed
eingestellt. (Im 2. Versuch auch auf Identity gestellt)


In meiner Anwendung versuche ich folgendes:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
MYDBEntities dc= new MYDBEntities();

Test u = new Test();
u.Name = "Max";
u.CreatedAt = DateTime.Now;
dc.AddToTests(u);
dc.SaveChanges();


Bei Zeile 7 bekomme ich die UpdateException mit folgender InnerException:
Zitat:
{"Der Wert NULL kann in die 'CreatedBy'-Spalte, 'MYDB.dbo.Tests'-Tabelle nicht eingefügt werden. Die Spalte lässt NULL-Werte nicht zu. Fehler bei INSERT.\r\nDie Anweisung wurde beendet."}



Was mache ich falsch?

Grüße Peter
gfoidl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 157
Erhaltene Danke: 19

Win XP
C#, Fortran 95 - Visual Studio
BeitragVerfasst: So 03.07.11 13:26 
Hallo,

wenn es damit Probleme gibt kann als Abhilfe (eher Ausweg) der Default-Wert auch im Konstruktor der Klasse gesetzt werden. (dazu ist die partielle Klasse zu erweitern die vom Designer generiert wurde).

mfG Gü

_________________
Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!
rittergig Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: So 03.07.11 20:12 
user profile icongfoidl hat folgendes geschrieben Zum zitierten Posting springen:
wenn es damit Probleme gibt kann als Abhilfe (eher Ausweg) der Default-Wert auch im Konstruktor der Klasse gesetzt werden. (dazu ist die partielle Klasse zu erweitern die vom Designer generiert wurde).

Das habe ich so gemacht, funktioniert auch so (als WorkAround).

Aber:
Das ist keine schöne Lösung. Eigentlich soll die Zeit immer auf den SQL-Server gesetzt werden, weil verschiedene Systeme möglicherweise nicht synchronisierte Uhren haben.

Eigentlich sollte das mit dem EF gehen. Hier z. B. funktioniert funktioniert das:
www.daniweb.com/soft...sharp/threads/258421

Warum geht das bei mir nicht?
Ich habe doch auch im Eigenschaften-Fenster, die Eigenschaft "StoreGeneratedPattern" auf Computed gesetzt. :(