【问题标题】:WCF Data Services saving data/entity issueWCF 数据服务保存数据/实体问题
【发布时间】:2011-09-19 08:05:51
【问题描述】:

我正在尝试通过 WCF 将数据保存回数据库,但我不断收到:

Cannot insert the value NULL into column 'Id', table 'ResellerPlatform.dbo.Contacts'; column does not allow nulls. INSERT fails. The statement has been terminated. (System.Data.UpdateException)

通过服务端本身的 WebGet 也会发生同样的情况:

[WebGet]
public void AddContact()
{
    var Contact = new Models.ResellerPlatform.Contact
    {
        Id = Guid.NewGuid(),
        Name = "Foo"
    };

    base.CurrentDataSource.AddToContacts(Contact);
    base.CurrentDataSource.SaveChanges();
}

Contact 模型是一个基本实体,有一个 Id(Guid)和一个 Name(字符串),没有任何关系或任何东西。这是我的访问规则:

Config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
Config.SetEntitySetAccessRule("*", EntitySetRights.All);

我不明白为什么它一直抛出异常,因为 Id 不是 null。想法、建议?

【问题讨论】:

  • 你用的是sql server吗?看起来 Id 列未填充。您可以使用 sql profiler 查看发送到 sql server 的内容。
  • Id是如何映射的?顺便提一句。 GET 操作不应该用于任何修改应用程序中数据的操作。
  • @rudolf_franek, Ladislav Mrnka 是的,我知道。我只是用它来调试,因为它更容易:-) SQL 分析器的好主意,但我怀疑它会是 NULL,知道为什么 WCF 会这样做吗?
  • 我希望您使用浏览器进行 GET 请求 - 我主要使用 www.fiddler2.com - 它允许使用所有 http 方法并轻松读取标头。

标签: c# sql wcf c#-4.0 wcf-data-services


【解决方案1】:

似乎将 StoreGeneratedPattern 设置为 none 解决了使用 Guid 作为主键时的问题 - 我认为 EF 可以将 Guid 作为主键处理?

【讨论】:

  • EF 4 可以处理带有StoreGeneratedPattern.Identity 的 GUID,而 EF 1 不能。但是你必须在数据库端生成 id 值!你已经告诉过你不这样做,所以这是你的错误。 EF 期望该值由数据库设置。看我的回答。
【解决方案2】:

在我看来,EF 期望数据库生成您的 Id 键列的值。

通常你必须选择:

  1. 和你一样在客户端(c#代码)生成id值,并将StoreGeneratedPattern属性设置为none
  2. 在数据库端生成id值并将StoreGeneratedPattern属性设置为Identity

EF 版本 1 不支持第二个选项。您必须在 xml 编辑器中打开并修改 edmx 文件才能使其正常工作(有关详细信息,请参阅此blog entry)。

您所做的是两种选择的混合:您在客户端代码中设置值,但通过 StoreGeneratedPattern=Identity 告诉 EF 数据库将生成该值。

【讨论】:

  • Id 列只是一个唯一标识符,没有默认值或任何东西。 imgur.com/F09bw
  • 你检查过映射吗?
  • Id属性的StoreGeneratedPattern属性值是多少?
  • 默认值(身份)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-24
  • 2011-06-13
相关资源
最近更新 更多