2010-06-25 701 views
6

Tôi thực sự đang cố gắng chèn một số dữ liệu vào 2 bảng cơ sở dữ liệu.Chèn dữ liệu mới bằng LINQ - WCF Data Services (trước đây là ADO.NET Data Services)

Tôi đang sử dụng LINQ trên WCF Data Services sử dụng Entity Framework 4.

2 bảng giống như thế này:

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; 

Mỗi nhân viên phải có chỉ 1 tài khoản. Tuy nhiên, một tài khoản có thể không có bất kỳ nhân viên nào cả.

Tôi đã tạo ra các đối tượng, và tiếp xúc với một DataService mà được thiết lập với các quy tắc truy cập thoải mái:

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

Sử dụng LinqPad tôi thành công có thể chèn một dòng Account đơn như thế này:

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

Tôi có thể thấy từ SQL Server rằng hàng đã được chèn vào, và LinqPad báo cáo không có lỗi.

Vấn đề là khi tôi cố gắng chèn cả một tài khoản liên quan và hàng nhân viên với nhau.

Tôi chắc chắn mã bên dưới sẽ hoạt động?

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

Câu trả lời tôi nhận được từ máy chủ (với các lỗi verbose kích hoạt) về cơ bản nói rằng:

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

Các lỗi đầy đủ là:

Đối tượng trong 'DbContainer.Employees' tham gia mối quan hệ 'EmployeeAccount'. Đã tìm thấy 'Tài khoản' có liên quan. 1 'Tài khoản' được mong đợi.

Có ai có ví dụ hoạt động với Dịch vụ dữ liệu WCF không?

Trả lời

7

Đối với bất cứ ai đọc bài viết này là giải pháp là để thêm dòng sau đây trước khi SaveChanges()

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

Đơn giản chỉ cần gán tài khoản cho người lao động vẫn chưa đủ, một liên kết cũng cần phải được thiết lập.

+0

Đẹp nhất. Đặt chỗ sau vì tôi chắc chắn tôi sẽ gặp phải vấn đề này khi tôi bắt đầu một số dịch vụ dữ liệu WCF sớm. –

+2

Đây là thứ mà WCF Data Services ** nên làm cho chúng ta ** vì ** trong mọi trường hợp ** bạn phải gọi 'SetLink' sau khi liên kết hai thực thể. – Yuck

+0

Lưu ý: Nếu bạn nhận được ngoại lệ "không bị theo dõi" khi gọi SetLink, hãy đảm bảo gọi 'AddToMySource (mySource)' _before_ gọi 'SetLink (mySource," Property ", myTarget)' – Pakman