Asp.net mvc模型类中虚拟财产的使用
上下文类Asp.net mvc模型类中虚拟财产的使用,asp.net,asp.net-mvc,entity-framework,Asp.net,Asp.net Mvc,Entity Framework,上下文类 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; }** } public class DataClass : DbContext
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; }**
}
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; }
}
如果您查看employee类属性
(from emp in dc.Employee
join designation in dc.Designation
on emp.DesignationID equals designation.DesignationID
select new Class3
{
Employee = emp ,
Designation = designation,
}).Single();
即使删除此属性,此属性也没有任何用处,代码仍然有效
我的方法正确吗??因为互联网上的每一个例子都定义了这个属性,但在我的例子中它是没有用的,我认为这些都是为了投影的目的,但不理解它的机制
谢谢虚拟属性主要由实体框架使用,而不是在您的应用程序中使用(据我所知)。因此,您可以安全地删除它:) 他们的实际行动: 在运行时,将为您的虚拟财产创建一个新类,实体框架将使用该类,因为它比使用常规类更快 编辑
它被称为,如果您真的想像示例中所示使用自制联接来查询数据,您可以安全地删除
Employee.Designation
属性
通常,实体框架使用虚拟属性来定义相关对象(第一次访问引用实体的属性时,从数据库自动加载实体或实体集合的过程)
因此,使用延迟加载可以将查询编写为
public virtual Designation Designation { get; set; }
EntityFramework将自己创建联接
旁注:在这种情况下,您的
Class3
viewmodel几乎与Employee
模型重复,因此看起来是多余的。但我想这可能是一些语法示例,而不是真实的示例。模型中的虚拟属性通常由ORM(例如实体框架/nHibernate)创建/使用,用于延迟加载(它们仅在访问数据时加载数据)
如果这里是这样的话,我希望看到你所有的虚拟财产都被应用了,而事实并非如此
在这种情况下,它似乎不需要是虚拟的,也不清楚问题是与虚拟财产有关还是与财产的存在有关
由于您没有使用Desgination
属性,您可以安全地删除它-免责声明:如果您的应用程序无法删除它,请快速将其放回……)
如果该类是自动创建的,那么您的数据库中很可能存在关系
有了这个属性,您可以通过设置
emp.Desgination
Virtual
实现一个属性/变量,同时允许它被它的子类覆盖,从而完全取消class3
。如果没有覆盖,它将确保有一些实现。希望有帮助。我在这里看不到任何问题……谢谢安迪·科尼耶夫,用虚拟财产进行查询看起来很容易。他们安迪在这里遇到了一个小问题(从dc.Employee的emp中选择新员工{Employee=emp,Designation=emp.Designation,});在Employee=emp、@FahadMeraj行上,它给我的错误是“Models.Employee不包含Employee的定义”。看起来您正试图摆脱以前用作viewmodel的Class3
,并将viewmodel类型更改为Employee
。在这种情况下,您的查询应该是dc中emp的。员工选择emp
,因为emp
已经是Employee
类型,无需再次包装它。但请注意,您使用的是single()
linq检索方法,并且查询中没有where
条件。在这种情况下,若查询返回多个值,将抛出异常。可能您刚刚忽略了where
条件。谢谢Teun Vos,我现在明白了谢谢freedomn-m,我现在明白了
(from emp in dc.Employee
select new Class3
{
Employee = emp ,
Designation = emp.Designation,
}).Single();