@Configuration
@Import({PropertyPlaceholderAutoConfiguration.class, ServerPropertiesAutoConfiguration.class,
EmbeddedServletContainerAutoConfiguration.class, DispatcherServletAutoConfiguration.class})
@EnableIntegration
public static class ContextConfiguration {
上下文类
public class Employee
{
[Key]
public int ID { get; set; }
public string Name { get; set; }
public int DesignationID { get; set; }
**public virtual Designation Designation { get; set; }**
}
ViewModelClass
public class DataClass : DbContext
{
public DbSet<Employee> Employee{ get; set; }
public DbSet<Designation> Designation { get; set; }
}
查询: -
public class Class3
{
public Employee Employee{ get; set; }
public Designation Designation { get; set; }
}
如果您查看员工类属性
(from emp in dc.Employee
join designation in dc.Designation
on emp.DesignationID equals designation.DesignationID
select new Class3
{
Employee = emp ,
Designation = designation,
}).Single();
即使删除此属性,此属性也没用,代码可以正常工作
我的方法是对的吗?因为互联网上的每个例子都定义了这个属性,但在我的情况下它是没有用的,我认为这些是出于投影目的而不理解它的机制
谢谢
答案 0 :(得分:3)
如果您确实想要使用自制联接查询数据,您可以安全地删除Employee.Designation
属性。
实体框架通常使用虚拟属性来处理相关对象的lazy loading(在第一次引用实体/实体的属性时,实体或实体集合自动从数据库加载的过程)访问)。
因此,使用延迟加载,您的查询可以写为
(from emp in dc.Employee
select new Class3
{
Employee = emp ,
Designation = emp.Designation,
}).Single();
和EntityFramework将自行连接。
旁注:在这种情况下,您的Class3
视图模型看起来几乎与Employee
模型重复,因此看起来多余。但我想这可能是一些同义的例子,而不是真实的例子。
答案 1 :(得分:1)
虚拟属性主要由实体框架使用,并且未在您的应用程序中使用(据我所见)。所以你可以安全地删除它:)。
他们实际做了什么: 在运行时,将为您的虚拟属性创建一个新类,并且实体框架将使用该类,因为它比使用常规类更快。
修改强> 它被称为lazy loading
答案 2 :(得分:1)
模型中的虚拟属性通常由ORM(例如Entity Framework / nHibernate)创建/使用,用于延迟加载(它们仅在访问数据时加载数据)。
如果在这种情况下是这种情况,我希望看到所有属性已应用虚拟,但他们并非如此。
在这种情况下,它似乎不需要是虚拟的,并且不清楚该问题是否与虚拟属性或属性的存在有关。
由于您未使用Desgination
属性,因此可以安全地将其删除 - 免责声明:如果您的应用程序因删除它而中断,请将其快速恢复....:)
如果该类是自动创建的,那么您的数据库中可能存在关系。
有了该属性,您可以通过设置class3
完全取消emp.Desgination
。