Вставка новых данных с помощью Linq WCF Data Services (ранее ADO.NET Data Services)

Я действительно изо всех сил пытаюсь вставить некоторые данные в 2 таблицы базы данных.

Я использую Linq вместо служб данных WCF с использованием Entity Framework 4.

Две таблицы выглядят так:

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, я могу успешно вставить одну строку Account следующим образом:

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

По SQL Server я вижу, что строка была вставлена, а LinqPad не сообщает об ошибке.

Проблема в том, что я пытаюсь вставить вместе связанные строки Account и Employee.

Я уверен, что приведенный ниже код должен работать?

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 Data Services?


person Jamie    schedule 25.06.2010    source источник


Ответы (1)


Для всех, кто это читал, решением было добавить следующую строку перед SaveChanges ()

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

Просто назначить учетную запись сотруднику было недостаточно, также необходимо было установить ссылку.

person FantasticJamieBurns    schedule 26.06.2010
comment
Хороший. Резервирование на потом, так как я уверен, что столкнусь с этой проблемой, когда скоро начну работу с некоторыми службами данных WCF. - person Joshua Hayes; 26.08.2010
comment
Это то, что WCF Data Services должны делать для нас, поскольку во всех случаях вы должны вызывать SetLink после связывания двух объектов. - person Yuck; 16.06.2011
comment
Примечание. Если при вызове SetLink вы получаете исключение, которое не отслеживается, обязательно вызовите AddToMySource(mySource) перед вызовом SetLink(mySource, "Property", myTarget) - person Pakman; 19.03.2012