Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# web方法WCF中的返回请求_C#_Entity Framework_Wcf - Fatal编程技术网

C# web方法WCF中的返回请求

C# web方法WCF中的返回请求,c#,entity-framework,wcf,C#,Entity Framework,Wcf,我有一个Web服务和一个方法,它通过实体框架向我的表“Customer”发出请求 我想返回请求的结果: [WebMethod] public Customer MyMethod(int id) { Model model = new Model(); Customer customer = new Customer(); try { customer = model.Customer.Where(x => x.Name == id).Fir

我有一个Web服务和一个方法,它通过实体框架向我的表“Customer”发出请求

我想返回请求的结果:

[WebMethod]
public Customer MyMethod(int id)
{
    Model model = new Model();
    Customer customer = new Customer();

    try
    {
        customer = model.Customer.Where(x => x.Name == id).First();
    }
    catch (Exception ex)
    {
        throw new System.NullReferenceException(ex.Message, ex.InnerException);
    }

    return customer;
}
我的类客户(由EF生成):

班级地址(由EF生成):

[表格(“地址”)]
公共部分类地址
{
公共地址()
{
Customer=newhashset();
}
公共int Id{get;set;}
[栏目(“地址”)]
[StringLength(255)]
公共字符串地址1{get;set;}
[长度(50)]
公共字符串{get;set;}
公共虚拟ICollection客户{get;set;}
}
但是当我用SoapUI调用我的方法时,我没有答案。如果我删除了虚拟
address
属性,那么我有一个答案,但我还需要返回地址(联合)


谢谢

因为
虚拟
属性,无法序列化模型以发送它们。您在customer中的地址引用了customers,而customers又引用了address。。。这是一个无限循环。因此,可以使用DTO(数据传输对象)类来传输数据。对于您的
客户
型号,它将如下所示:

public class CustomerDTO
{
  public int Id { get; set; }
  public string Name { get; set; }
  public int? Adress_id { get; set; }

  public Adress Adress { get; set; }      
}
在通过WCF发送之前,您必须将
Customer
转换为
CustomerDTO
对象。您甚至可以使用linq在一条语句中实现这一点:

var obectToTransfer = db.Customers.Where(c => c.Id == 5)
                                  .Select(c => new CustomerDTO
                                  {
                                     Id = c.Id
                                     ...
                                  }).FirstOrDefault();

如果要在查询中显式加载相对属性,可以通过使用
Include
extension方法急切加载来实现:

 customer = model.Customer.Include(c=>c.Address).Where(x => x.Name == id).First();
您还可以使用显式加载:

 customer = model.Customer.Where(x => x.Name == id).First();
 context.Entry(customer).Reference(p => p.Address).Load();

现在,我建议您在数据库中检查这种关系。如果您没有使用Fluent Api来配置该关系,则EF不知道
Address\u id
是该关系的FK。如果外键属性的名称为
[目标类型密钥名称]
[目标类型名称]+[目标类型密钥名称],
[导航属性名称]+[目标类型密钥名称]
,则将按约定查找外键属性。覆盖此约定的一种方法是使用属性。因此,首先检查数据库中的关系,然后检查是否有与要加载的客户相关的
地址
。您应该能够使用我上面建议的两个变体之一加载
地址
导航属性。

我删除了类客户中的关键字virtual:

[Table("Customer")]
public partial class Customer
{
    public int Id { get; set; }

    [StringLength(50)]
    public string Name { get; set; }

    public int? Adress_id { get; set; }

    public Adress Adress { get; set; }
}
我删除了类地址中的构造函数和属性
ICollection Customer

[Table("Adress")]
public partial class Adress
{
    public int Id { get; set; }

    [Column("Adress")]
    [StringLength(255)]
    public string Adress1 { get; set; }

    [StringLength(50)]
    public string Town { get; set; }
}
我的查询:
customer=model.customer.Include(“地址”).Where(x=>x.Id==2.First()

它起作用了

我的答复是:

<a:Adress>
   <a:Adress1>101 Madison Ave</a:Adress1>
   <a:Id>1</a:Id>
   <a:Town>New York</a:Town>
</a:Adress>
<a:AdressId>1</a:AdressId>
<a:Name>John</a:Name>
<a:Id>2</a:Id>

麦迪逊大街101号
1.
纽约
1.
约翰
2.


但是猜测您的模型是
dbcontext
是不切实际的,
model.Customer.include(“address”).Where(x=>x.Name==id)。First()
是相同的,通过修改行没有答案。您能解释您需要什么吗?返回我的查询结果。客户+地址您确定在数据库中有与该客户相关的地址吗?如何映射两者?谢谢。这是必须的吗?这取决于,例如,如果您序列化为可以使用的Json,那么它有一些用于序列化虚拟属性的选项。但总的来说,使用DTO’是一种很好的做法,如果我在select中写入
Adress=x.Adress
,我没有response@Azertya您是否使用fluent api映射了客户和地址之间的关系?我的数据库中有一个关系:
Include(c=>c.address)中有一个错误
无法将lambda表达式转换为类型“string”,因为它不是委托类型。我的数据库中有一个关系:Include方法仅用于导航属性。对于标量属性,您不需要这样做,当您从数据库中加载实体时,它们将始终被加载。如果我提出一个简单的请求,我很好地掌握了所建立的自动关系:-为什么它不实用?只是xmlIt不实际,必须更改EntityFramework生成的类才能正确检索原始类中的结果添加
[ForeignKey(“address”)]
以上
地址ID
客户
模型中。我想你只是没有在实体框架中映射关系,所以延迟加载/急切加载是不可能的。不,我没有回应。因为虚拟属性,不可能序列化模型来发送它们。因此我关于DTO类的回答,你现在的解决方案非常奇怪:p
[Table("Adress")]
public partial class Adress
{
    public int Id { get; set; }

    [Column("Adress")]
    [StringLength(255)]
    public string Adress1 { get; set; }

    [StringLength(50)]
    public string Town { get; set; }
}
<a:Adress>
   <a:Adress1>101 Madison Ave</a:Adress1>
   <a:Id>1</a:Id>
   <a:Town>New York</a:Town>
</a:Adress>
<a:AdressId>1</a:AdressId>
<a:Name>John</a:Name>
<a:Id>2</a:Id>