实体框架“基本”怀疑

时间:2014-11-16 20:03:15

标签: c# sql-server entity-framework-6

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

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

3 个答案:

答案 0 :(得分:1)

1)只有与您的查询匹配的实体才会加载到内存中,并且只有在迭代列表时才会出现这种情况。 (感谢yield,除非您执行.ToList()

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

3)您可以对SQL Server数据库中的UpdatedOn字段或CreatedOn字段的Defaults使用触发器。不要在Code First实体中包含这些属性,并且您可以正常使用(除非您希望将它们用于C#中的任何类型的查询)。

答案 1 :(得分:0)

  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

答案 2 :(得分:0)

  1. 如果您的数据库很大并且有10,000个表,那么您应该避免使用单个上下文,因为这将被初始化并加载每次初始化到上下文并且将在内存中,因此您应该通过使用有界来避免这种情况将表划分为逻辑区域的上下文,例如财务上下文,安全上下文等,每个上下文将仅定义上下文处理的表,从而导致更轻的初始化和更快的处理。看到这个链接 http://msdn.microsoft.com/en-us/magazine/jj883952.aspx

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

  3. 希望有所帮助。