2010-06-25 6 views
6

Ich habe wirklich Mühe, einige Daten in zwei Datenbanktabellen einzufügen.Einfügen neuer Daten mit Linq - WCF Data Services (früher ADO.NET Data Services)

Ich verwende Linq über WCF Data Services Entity Framework 4.

Die 2 Tabellen wie folgt aussehen:

CREATE TABLE [dbo].[Accounts] (
    [Id] int IDENTITY(1,1) NOT NULL, 
    [Email] nvarchar(max) NOT NULL, 
    [Password] nvarchar(max) NOT NULL 
); 

CREATE TABLE [dbo].[Employees] (
    [Id] int IDENTITY(1,1) NOT NULL, 
    [Name] nvarchar(max) NOT NULL, 
    [Role] nvarchar(max) NOT NULL, 
    [Account_Id] int NOT NULL 
); 

ALTER TABLE [dbo].[Employees] 
ADD CONSTRAINT [FK_EmployeeAccount] 
    FOREIGN KEY ([Account_Id]) 
    REFERENCES [dbo].[Accounts] 
    ([Id]) 
    ON DELETE NO ACTION ON UPDATE NO ACTION; 

Jeder Mitarbeiter muss nur 1 Konto haben. Ein Konto darf jedoch überhaupt keine Mitarbeiter haben.

Ich habe die Einheiten erzeugt und belichtet, um ein Data die Einrichtung mit entspannten Zugriffsregeln ist:

config.SetEntitySetAccessRule("Accounts" , EntitySetRights.All); 
config.SetEntitySetAccessRule("Employees" , EntitySetRights.All); 

LinqPad Verwendung von I erfolgreich eine einzelne Konto Zeile wie folgt einfügen:

var context = this; 
Account account = Account.CreateAccount(1, "[email protected]", "[email protected]"); 
context.AddToAccounts(account); 
context.SaveChanges(); 

Ich kann von SQL Server sehen, dass die Zeile eingefügt wurde, und LinqPad meldet keinen Fehler.

Das Problem ist, wenn ich versuche, beide eine verwandte Konto und Mitarbeiter Zeile zusammen einzufügen.

Ich bin sicher, der folgende Code sollte funktionieren?

var context = this; 
Account account = Account.CreateAccount(1, "[email protected]", "password"); 
context.AddToAccounts(account); 
Employee employee = Employee.CreateEmployee(1, "Foo", "Developer"); 
employee.Account = account; 
context.AddToEmployees(employee); 
context.SaveChanges(); 

Die Antwort, die ich vom Server zurück (mit ausführlichen Fehlern aktiviert) sagt im Grunde, dass:

Account row inserted successfully (HTTP 201) 
Employee row did not insert (HTTP 500) 

Der vollständige Fehler ist:

Entities in 'DbContainer.Employees' teilnehmen die 'EmployeeAccount'-Beziehung. 0 verwandtes 'Konto' wurde gefunden. 1 'Konto' wird erwartet.

Hat jemand ein Beispiel, das gegen WCF Data Services funktioniert?

Antwort

7

Für alle diese die Lösung zu lesen war die folgende Zeile vor Savechanges()

context.SetLink(employee, "Account", account); 

einfach die Zuordnung das Konto der Mitarbeiter war nicht genug, wird ein Link auch festgestellt werden musste hinzuzufügen.

+0

Nice one. Für später buchen, da ich sicher bin, dass ich auf dieses Problem stoße, wenn ich bald mit einigen WCF-Datendiensten anfange. –

+2

Dies ist etwas, was WCF Data Services ** für uns tun sollte ** seit ** in allen Fällen ** müssen Sie 'SetLink' aufrufen, nachdem Sie zwei Entitäten zugeordnet haben. – Yuck

+0

Hinweis: Wenn Sie beim Aufrufen von SetLink eine Ausnahme "nicht verfolgt" erhalten, stellen Sie sicher, dass Sie 'AddToMySource (mySource)' _vor Aufruf von 'SetLink (mySource," Property ", myTarget)' aufrufen – Pakman