刚刚开始尝试EF,并且遇到了一些疑问:
感谢。
答案 0 :(得分:1)
1)只有与您的查询匹配的实体才会加载到内存中,并且只有在迭代列表时才会出现这种情况。 (感谢yield
,除非您执行.ToList()
)
2)延迟实例化意味着对象的复杂属性仅在您使用时从数据库中提取(除非您有.Include()
)。
3)您可以对SQL Server数据库中的UpdatedOn字段或CreatedOn字段的Defaults使用触发器。不要在Code First实体中包含这些属性,并且您可以正常使用(除非您希望将它们用于C#中的任何类型的查询)。
答案 1 :(得分:0)
延迟加载允许在需要时加载实体,这意味着在那之前,它们不是从数据库中获取的。例如(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);
}
}
答案 2 :(得分:0)
如果您的数据库很大并且有10,000个表,那么您应该避免使用单个上下文,因为这将被初始化并加载每次初始化到上下文并且将在内存中,因此您应该通过使用有界来避免这种情况将表划分为逻辑区域的上下文,例如财务上下文,安全上下文等,每个上下文将仅定义上下文处理的表,从而导致更轻的初始化和更快的处理。看到这个链接 http://msdn.microsoft.com/en-us/magazine/jj883952.aspx
关于创建日期,我也是这样做的,我定义了一个名为ITrackable的接口,它具有createddate属性,并且还修改了具有这些属性的所有实体,并实现了这个接口,这允许我在之前设置这些字段我通过循环遍历ITrackable类型的所有跟踪实体来设置保存过程,并设置创建日期和修改日期属性。
希望有所帮助。