LINQ To SQL Problem

27/08/2008 - 09:04 von Rafael G. | Report spam
Hallöchen,

habe hier ein Phànomen, dass ich nicht nachvollziehen kann.
Habe zu einem Datensatz immer zwei Aenderungs-Datensàtze (Erstellt und
Geaendert, die u.a. die BenutzerID und das Datum enthalten).
Jetzt speichere ich ein Objekt der Klasse A, dann werden von LINQ To SQL
brav zuerst die zwei Änderungs-Datensàtze angelgegt und anschliessend
das Objekt selbst. Speichere ich das Objekt der Klasse B, dann fàllt er
auf die Nase, da die Änderungsdatensàtze nicht automatisch angelegt
werden. Bei beiden Tabellen sind die zwei IDs als FKs auf die Tabelle
'Aenderung' definiert. Ich verstehe einfach nicht, wo da der Unterscheid
sein soll. LINQ To SQL kannst doch nicht willkürlich machen. Mal
mitspeichern, mal nicht.

Aufruf für beide Klassen sieht so aus.
A myA = new A();
myA.Bla = ...;
myA.Erfasst = new Aenderung(...);
myA.Geaendert = new Aenderung(...);

myDataContext.TabelleA.InsertOnSubmit(myA);
myDataContext.SubmitChanges();


Klassenaufbau:

class A und B
{
private int m_ErfasstID;
private int m_GeaendertID;

Aenderung Erfasst { get; set;}
Aenderung Geaendert { get; set;}
}

class Aenderung
{
private DateTime m_Datum;
private int m_UserID;
}

vg
Rafael
 

Lesen sie die antworten

#1 Elmar Boye
27/08/2008 - 10:41 | Warnen spam
Hallo Rafael,

Rafael G. schrieb:
habe hier ein Phànomen, dass ich nicht nachvollziehen kann.



und ich wiederum das von Dir beschriebene Phànomen nicht ;-)

Habe zu einem Datensatz immer zwei Aenderungs-Datensàtze (Erstellt und
Geaendert, die u.a. die BenutzerID und das Datum enthalten).



Ich lasse mal offen, ob das Design optimal und der Nutzen gegeben ist
- es verursacht auf jeden Fall einiges an Zusatzaufwand auf DB Seite
und schlichte Spalten wàren oftmals angemessener.

Jetzt speichere ich ein Objekt der Klasse A, dann werden von LINQ To SQL
brav zuerst die zwei Änderungs-Datensàtze angelgegt und anschliessend
das Objekt selbst. Speichere ich das Objekt der Klasse B, dann fàllt er
auf die Nase, da die Änderungsdatensàtze nicht automatisch angelegt
werden. Bei beiden Tabellen sind die zwei IDs als FKs auf die Tabelle
'Aenderung' definiert. Ich verstehe einfach nicht, wo da der Unterscheid
sein soll. LINQ To SQL kannst doch nicht willkürlich machen.



Tut LINQ vermutlich nicht, wahrscheinlicher fehlt da etwas in Deiner
Beschreibung.
Ich habe mal versucht das Problem für die untenstehenden Tabellen und
dem nachfolgenden Testcode nachzuvollziehen. Klappte wie gesagt nicht.

Probiere es bei Dir selbst, ob das Phànomen dabei auftritt.
Und passe ggf. den Code so an, bis der Fehler erscheint.

Dann làßt sich das Phànomen sehr wahrscheinlich klàren.

Gruß Elmar


DROP TABLE dbo.ÄnderungA, dbo.ÄnderungB, dbo.Änderung
GO

CREATE TABLE dbo.Änderung
(
ID int not NULL IDENTITY(1, 1),

UserID int NOT NULL DEFAULT(0),
Datum datetime NOT NULL DEFAULT(GETDATE()),

CONSTRAINT PK_Änderung PRIMARY KEY (id)
)
GO

CREATE TABLE dbo.ÄnderungA
(
ID int NOT NULL IDENTITY(1, 1),
Beschreibung nvarchar(40) NOT NULL,

ErfasstID int NULL,
ÄnderungID int NULL,

CONSTRAINT PK_ÄnderungA PRIMARY KEY (id),

CONSTRAINT FK_ÄnderungA_Erfasst
FOREIGN KEY (ErfasstID)
REFERENCES dbo.Änderung (ID),

CONSTRAINT FK_ÄnderungA_Änderung
FOREIGN KEY (ÄnderungID)
REFERENCES dbo.Änderung (ID)
)

CREATE TABLE dbo.ÄnderungB
(
ID int NOT NULL IDENTITY(1, 1),
Beschreibung nvarchar(40) NOT NULL,

ErfasstID int NULL,
ÄnderungID int NULL,

CONSTRAINT PK_ÄnderungB PRIMARY KEY (id),

CONSTRAINT FK_ÄnderungB_Erfasst
FOREIGN KEY (ErfasstID)
REFERENCES dbo.Änderung (ID),

CONSTRAINT FK_ÄnderungB_Änderung
FOREIGN KEY (ÄnderungID)
REFERENCES dbo.Änderung (ID)
)
GO

using (ÄnderungDataContext dc = new ÄnderungDataContext())
{
Änderung ErfasstVon = new Änderung();
ErfasstVon.UserID = 2;
ErfasstVon.Datum = DateTime.Now;

Änderung ÄnderungVon = new Änderung();
ÄnderungVon.UserID = 1;
ÄnderungVon.Datum = DateTime.Now.AddDays(1);

ÄnderungA a = new ÄnderungA();
a.Beschreibung = "Änderung A von 2";
a.Erfasst = ErfasstVon;
a.Änderung = ÄnderungVon;
dc.ÄnderungA.InsertOnSubmit(a);

ÄnderungB b = new ÄnderungB();
b.Beschreibung = "Änderung B von 3";

ErfasstVon = new Änderung();
ErfasstVon.UserID = 3;
ErfasstVon.Datum = DateTime.Now.AddDays(-3);

b.Erfasst = ErfasstVon;
b.Änderung = ÄnderungVon;
dc.ÄnderungB.InsertOnSubmit(b);

dc.SubmitChanges();
}

Ähnliche fragen