2010-06-25 64 views
6

我非常努力地將一些數據插入到2個數據庫表中。使用Linq插入新數據 - WCF數據服務(以前稱爲ADO.NET數據服務)

我使用實體框架4.

的2個表看起來像這樣使用LINQ在WCF數據服務:

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; 

每名員工必須僅有1帳戶。但是,帳戶可能根本沒有任何員工。

我已經生成的實體,並露出了DataService的是建立以輕鬆訪問規則:

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

使用LinqPad我可以成功地插入一個單一賬戶行像這樣:

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

我可以從SQL Server看到該行已被插入,並且LinqPad報告沒有錯誤。

問題是,當我嘗試將相關的帳戶和員工行一起插入時。

我確定下面的代碼應該可以工作嗎?

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(); 

我回來從服務器(啓用了詳細錯誤)的反應基本上是說:

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

完整的錯誤是:在「DbContainer.Employees」參加

實體'EmployeeAccount'關係。找到0個相關的「帳戶」。 1'帳戶'預計。

有沒有人有一個針對WCF數據服務的例子?

回答

7

對於任何人閱讀此的解決方案是增加的SaveChanges之前以下行()

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

簡單地分配帳戶的員工是不夠的,鏈路也需要建立。

+0

不錯的。之後預訂,因爲我確信當我開始使用一些WCF數據服務時,我會遇到這個問題。 – 2010-08-26 01:00:02

+2

這是WCF數據服務**應該爲我們**做的事情,因爲在所有情況下**都必須在關聯兩個實體後調用SetLink。 – Yuck 2011-06-16 19:21:00

+0

注意:如果在調用SetLink時收到「未被跟蹤」異常,請確保調用'AddToMySource(mySource)'_before_調用'SetLink(mySource,「Property」,myTarget)'' – Pakman 2012-03-19 15:21:48