实体框架“基本”疑问

本文关键字:疑问 基本 框架 实体 | 更新日期: 2023-09-27 18:30:37

刚开始尝试EF,遇到了一些疑问:

  1. 假设我有一个包含 10 000 行的数据库表。在我的源中实例化 EF 实体时,内存中是否有这 10 000 行?
  2. 惰性实例化机制是否对上述内容有某种影响?
  3. 我的做法是在数据库表上包含一些审计字段,例如 CreateOn 和 ChangedOn。这些是DateTime,我用它来将其值设置为GETDATE()(SQL Server时间)。EF 允许在客户端计算机(桌面应用)或 IIS 上更改实体属性。有没有办法在 SQL Server 上设置这些值?

谢谢。

实体框架“基本”疑问

> 1) 只有与您的查询匹配的实体才会加载到内存中,并且仅在迭代列表时发生。(感谢yield,除非你做.ToList()

2)延迟实例化意味着对象的复杂属性仅在您使用它们时从数据库中获取(除非您有.Include())。

3) 您可以对 SQL Server 数据库中的"更新"字段使用触发器,也可以对"创建时间"字段使用默认值。不要在 Code First 实体中包含这些属性,这样就可以了(除非你想在 C# 中将它们用于任何类型的查询)。

  1. 实例化实体框架时,不会获取任何数据。只有通过 ADO.NET 设置连接(连接被添加到池等)。
  2. 延迟加载允许在需要时加载实体,这意味着在此之前,它们不会从数据库中获取。例如 (http://msdn.microsoft.com/en-us/library/vstudio/dd456846(v=vs.100).aspx):

    using (AdventureWorksEntities context =new AdventureWorksEntities())
    {
        // You do not have to set context.ContextOptions.LazyLoadingEnabled to true 
        // if you used the Entity Framework to generate the object layer.
        // The generated object context type sets lazy loading to true
         // in the constructor. 
        context.ContextOptions.LazyLoadingEnabled = true;
        // Display ten contacts and select a contact
        var contacts = context.Contacts.Take(10);
        foreach (var c in contacts)
            Console.WriteLine(c.ContactID);
        Console.WriteLine("Select a customer:");
        Int32 contactID = Convert.ToInt32(Console.ReadLine());
        // Get a specified customer by contact ID. 
        var contact = context.Contacts.Where(c => c.ContactID == contactID).FirstOrDefault();
        // If lazy loading was not enabled no SalesOrderHeaders would be loaded for the contact.
        foreach (SalesOrderHeader order in contact.SalesOrderHeaders)
        {
            Console.WriteLine("SalesOrderID: {0} Order Date: {1} ",
                order.SalesOrderID, order.OrderDate);
        }
    }
    
  3. 答案在这里:https://stackoverflow.com/a/5965620/1617002
  1. 如果您的数据库很大并且有 10,000 个表,那么您应该避免使用单个上下文,因为它将在每次初始化时初始化并加载到上下文中并且将位于内存中,因此您应该通过使用边界上下文来避免这种情况,您将表划分为逻辑区域,例如财务上下文, 安全上下文等,每个上下文将仅定义上下文正在处理的表,从而导致更轻的初始化和更快的处理。查看此链接http://msdn.microsoft.com/en-us/magazine/jj883952.aspx

  2. 关于创建日期,我做同样的事情,我定义了一个名为 ITrackable 的接口,该接口具有 createddate 属性,并且还修改了日期,并通过具有这些属性的所有实体实现此接口,这允许我在执行 ef 保存过程之前设置这些字段通过循环遍历所有跟踪的实体 ITrackable 并设置创建日期和修改日期属性。

希望有帮助。