【问题标题】:Entity class with Foreign key tables具有外键表的实体类
【发布时间】:2014-04-24 16:35:50
【问题描述】:

在 ASP.NET Web API 服务模型中,由 ADO.NET 实体框架数据模型数据库优先方法生成的实体类组成。

当模型在服务响应中返回给客户端时,外键表中的数据也会被返回。例如:Customer 表包含 Contact 表作为外键表。

生成POCO(实体)的实体框架如下。

public partial class Customer
{
public int Id {get;set;}
public FirstName {get;set}
public LastName {get;set;}

//Foreign key table
public virtual Contact Contact {get;set;}
}

服务模型是:

public class Customer
{
        public Customer customer {get;set;}
}

从 API 控制器创建模型类的实例,从数据库中检索数据并返回给客户端。

问题是“当客户表中的所有记录或单个记录返回给客户端时,它也会返回外键(引用)表中的数据。 假设 Contact 表中有大约 100 个联系人,当 Web 服务客户端请求一个资源时,返回的数据也包括 Customer 表中的所有数据。

感谢您解决此问题。

问候

【问题讨论】:

  • 不应该,因为virtual 关键字意味着这些相关记录将被延迟加载。您是否使用Include() 赢得您的查询?
  • 如何确认相关数据返回?您是否使用分析器来查看生成的 SQL 查询?还是您只是检查实体上的集合?如果是后者,那么您可能是延迟加载,这会给人一种数据存在的错误印象,而实际上,它是按需查询。
  • @ChrisHardie 它们在尝试序列化时会被延迟加载,因为它被标记为virtualInclude() 用于热切加载。

标签: asp.net web-services entity-framework


【解决方案1】:

将 ObjectContext 的“LazyloadingEnabled”属性设置为 False 已解决问题。

context.Configuration.LazyLoadingEnabled = false;

更多信息请访问http://msdn.microsoft.com/en-us/library/vstudio/dd456846(v=vs.100).aspx http://msdn.microsoft.com/en-ie/data/jj574232.aspx

【讨论】:

    【解决方案2】:

    我的猜测是,当 WebAPI 序列化 Customer 对象时,Contacts 集合被延迟加载然后序列化。一种选择是在退货之前手动分离客户。

    context.Detach(customer);
    

    见:

    http://msdn.microsoft.com/en-us/library/vstudio/system.data.objects.objectcontext.detach(v=vs.100).aspx http://msdn.microsoft.com/en-us/library/vstudio/bb738697(v=vs.100).aspx

    开斋节:

    考虑使用数据传输对象 (DTO)。这将允许您控制要传输的序列化内容。我喜欢使用AutoMapper(可通过 NuGet 获得)将数据从我的 EF 模型复制到 DTO。

    【讨论】:

    • 通用存储库和工作单元模式用于与底层数据层进行交互。在返回数据之前分离对象是不可行的。进一步的帮助和见解表示赞赏。
    • 嗨,克里斯! POCO 由 ADO.NET 实体数据模型向导生成,该向导将虚拟关键字添加到 FK 对象(表)。在查询中不使用任何 Include()。
    • 嗨贾斯汀! JSON 数据在序列化后由 Web API 服务返回。所以它是相当透明的。
    猜你喜欢
    • 2013-08-05
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 2011-12-22
    • 1970-01-01
    • 2012-08-21
    相关资源
    最近更新 更多