Я действительно изо всех сил пытаюсь вставить некоторые данные в 2 таблицы базы данных.
Я использую Linq по Услугам передачи данных WCF с помощью Платформы Объекта 4.
Эти 2 таблицы похожи на это:
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, "foo@example.com", "p@ssword");
context.AddToAccounts(account);
context.SaveChanges();
Я вижу от SQL Server, что строка была вставлена, и LinqPad не сообщает ни о какой ошибке.
Проблема состоит в том, когда я пытаюсь вставить и связанную строку Учетной записи и Сотрудника вместе.
Я уверен, что код ниже должен работать?
var context = this;
Account account = Account.CreateAccount(1, "foo@example.com", "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. Сотрудники участвуют в отношениях 'EmployeeAccount'. 0 связанных 'Учетных записей' были найдены. 1 'Учетная запись' ожидается.
У кого-либо есть пример, который работает против Услуг передачи данных WCF?
Для всех, кто читал это, решение заключалось в том, чтобы добавить следующую строку перед SaveChanges ()
context.SetLink(employee, "Account", account);
Простого назначения учетной записи сотруднику было недостаточно, также необходимо было установить ссылку.