Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc模型类中虚拟财产的使用_Asp.net_Asp.net Mvc_Entity Framework - Fatal编程技术网

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();