【问题标题】:I'm testing a WCF Service and an EF Data layer, receiving String columns as (null), but receive integers as real data. Why are the strings null?我正在测试 WCF 服务和 EF 数据层,将字符串列接收为(null),但接收整数作为真实数据。为什么字符串为空?
【发布时间】:2020-05-04 00:22:22
【问题描述】:
I'm building a multi-layered Windows VS C# solution that has a WCF Service Library project with EF6.2 loaded, and an ADO.NET Data layer with EF6.2 also.

EDMX 模型是从我的笔记本电脑上的 MSSQL Server Express 2016 服务器构建为“数据库优先”的一组表。我的 WCF 服务接口和代码 此时只有其中一个表的属性和方法。该表也已在逻辑和数据层方法中构建。 因此,我现在正在使用 WCF 测试客户端测试该服务,并且在我的服务对数据层的响应中正确接收到一些整数数据,但没有字符串数据。

While testing my "GetMemberByID" method, it returns all String column results as a value of "(null)", and a type of "NullObject",

但返回整数及其实际值。 WCF Soap 响应将返回的字符串值显示为“”。但是,
整数返回如下:“7”。我的测试数据库中有超过 50 个数据行用作源 对于 EF6.2 EDMX 构建。我的 App.config 在数据和服务层中引用了相同的 (localdb)\ V13.0 服务器和数据库。

有没有人遇到过这个问题,你能告诉我我错过了什么吗? MSSQL 数据库最初是一个 (OleDb) MS Access 数据库,我将其导入 MSSQL 服务器。提前致谢。

【问题讨论】:

    标签: wcf ado.net-entity-data-model


    【解决方案1】:

    序列化过程似乎有问题。在我这边,可以正确返回字符串字段。默认情况下,DataContractSerializer 用于反序列化/反序列化复杂对象数据。
    https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/using-data-contracts
    最可能的原因可能是可空字段没有被[DataMember] 属性修饰。请检查客户端自动生成的DataContract列是否包含[DataMember]属性。
    http://sivakrishnakuchi.blogspot.com/2010/05/troubleshoot-wcf-service-returning.html
    如果问题仍然存在,请随时告诉我。

    【讨论】:

    • 感谢亚伯拉罕。这是 DataContract 的样子,我确实有所有属性的“DataMember”属性: [DataContract] public class Member { [DataMember] public int MemberID { get;放; } [DataMember] 公共字符串 Last_Name { 获取;放; } [DataMember] 公共字符串 First_Name { 获取;放; }
    • 2. DataContract是由EDMX自动生成的,即实体类吗?在我这边,这是默认的实体类,它可以正常工作。公共部分类书{公共int ID {获取;放; } 公共字符串名称 { 获取;放; } 公共 Nullable 价格 { 获取;放; } public Nullable CreatedTime { get;放;这个实体类定义应该对应数据库表结构。
    • 嗨,亚伯拉罕,我不确定我是否理解您的要求,但是我在创建服务项目时从默认值创建了自己的 ServiceContract,并在服务项目中构建了自己的 DataContract。 EDMX 确实自动构建了上下文和 .cs 文件,我将其用作“模型”来构建我的 ServiceContract。
    • 另外,只有两列不是字符串类型——一列是标识,另一列是字节[]。字符串类型是默认值,我还没有看到任何需要在 DataContract 中使用“Nullable”限定符的字符串类型示例。
    • 这里是我的表的 EDMX *.tt 条目中自动生成的 *.cs 文件的开头: public partial class Member { public int MemberID { get;放; } 公共字符串 Last_Name { 获取;放; } 公共字符串 First_Name { 获取;放; } 公共字符串 MidInit { 获取;放; } 公共字符串 Email_Address { 获取;放; } 公共字符串 Home_Phone { 获取;放; } 公共字符串 Cell_Phone { 获取;放; } 公共字符串 Mailing_Address { 获取;放; } 公共字符串城市 { 获取;放; }
    【解决方案2】:

    好的,我发现了我的错误。在将业务域对象翻译回 Service.cs 代码文件中的服务对象时,我只翻译了 MemberID 和 RowVersion,没有翻译其他列。因此,WCF 测试客户端结果中显示的唯一内容是 MemberID 和 RowVersion - 这恰好是我的实体中仅有的两个非字符串。所有字符串类型都是空的,因为我没有将它们翻译回服务。谢谢你看这个,亚伯拉罕,但你让我开始仔细观察,谢谢你的建议。 MS 文档也很有帮助。一旦我完成了从 UI 到数据层并返回的完整“步入”调试跟踪,我就能够看到数据转换失败。还有一件事,在我可以逐步调试到数据层并返回到服务层之前,我必须解决很多人遇到的“基础数据库未打开”问题。我通过本地 IIS 托管我的服务,并且必须对 IIS 应用程序进行一些有关用户凭据的更改。我的 App.config 设置为使用“Integrated Security=True” - 这是 IIS 应用程序池中的“直通”凭据。我将 IIS 应用程序设置为“特定用户”,但没有在连接字符串中使用用户 ID/密码。一旦我将我的 IIS 应用程序更改为“直通” - 我就能够连接并调试到 DAL 并返回。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      • 2014-11-04
      • 1970-01-01
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      相关资源
      最近更新 更多