【问题标题】:Insert New Data using Linq -- WCF Data Services (formerly ADO.NET Data Services)使用 Linq 插入新数据——WCF 数据服务(以前的 ADO.NET 数据服务)
【发布时间】:2010-06-26 18:21:54
【问题描述】:

我真的很难将一些数据插入到 2 个数据库表中。

我正在使用 Entity Framework 4 通过 WCF 数据服务使用 Linq。

两张表如下所示:

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.Employees”中的实体参与“EmployeeAccount”关系。找到 0 个相关的“帐户”。需要 1 个“帐户”。

有人有针对 WCF 数据服务的示例吗?

【问题讨论】:

    标签: c# linq entity-framework-4 wcf-data-services


    【解决方案1】:

    对于阅读本文的任何人,解决方案是在 SaveChanges() 之前添加以下行

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

    仅将帐户分配给员工是不够的,还需要建立一个链接。

    【讨论】:

    • 不错的一个。稍后再预订,因为我确信当我很快开始使用一些 WCF 数据服务时会遇到这个问题。
    • 这是 WCF 数据服务应该为我们做的事情,因为在所有情况下您必须在关联后致电 SetLink两个实体。
    • 注意:如果您在调用 SetLink 时收到“未被跟踪”异常,请确保在调用 AddToMySource(mySource)之前调用 SetLink(mySource, "Property", myTarget)
    猜你喜欢
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 2010-09-24
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多