C# 实体框架中的映射?

C# 实体框架中的映射?,c#,.net,entity-framework,C#,.net,Entity Framework,在观看一些实体框架教程时,我发现有很多方法可以在两个实体之间创建关系。但我很难理解这些台词的确切含义 public virtual Person person { set; get; } public virtual IEnumerable<Person> person { set; get; } public virtual ICollection<Person> person { set; get; } 公共虚拟人{set;get;} 公共虚拟IEnumerab

在观看一些实体框架教程时,我发现有很多方法可以在两个实体之间创建关系。但我很难理解这些台词的确切含义

public virtual Person person { set; get; }

public virtual IEnumerable<Person> person { set; get; }

public virtual ICollection<Person> person { set; get; }
公共虚拟人{set;get;}
公共虚拟IEnumerable person{set;get;}
公共虚拟ICollection person{set;get;}
在其中一个视频中,他们解释说,当您同时创建虚拟属性和
ICollection
时,这将启用延迟加载


在这个实例中,virtual关键字做了什么?如果我们在没有virtual关键字的情况下尝试,会发生什么?

EF需要将类实现为virtual,因为代理在运行时被创建为继承的类。延迟加载引擎所做的是在后台重新实现(覆盖)这些属性,以便按预期工作。关键字正好做到了这一点:允许其他类重写其实现。这就是为什么如果您希望启用延迟加载并工作,就需要这些虚拟属性的基本原因

您会注意到,当启用延迟加载时,您在运行时获得的输入的名称很奇怪,如“Person_proxy9873216546697987465449”

关于关系,每当您在数据库中创建一个具有1:N关系的实体时,您可以拥有一个集合,该集合将自动列出其关系,因此您可以在代码中使用它,如本例所示,假设“Person 1:N Orders”:


var ordersFromSomePerson=person.Orders

为了回答为什么虚拟ICollection在EF中启用延迟加载的问题,我们需要C#中virtual关键字的定义和含义。发件人:

从概念上讲,它是继承机制的一部分

通常情况下,子类需要另一个(扩展的)功能作为基类。在这种情况下,virtual关键字允许程序员重写(如果需要,当前实现的基类的默认实现,但所有其他预定义方法/属性/等仍然取自基类

一个简单的例子是:

// base digit class
public class Digit
{
    public int N { get; set; }
    // default output
    public virtual string Print()
    {
        return string.Format("I am base digit: {0}", this.N);
    }
}

public class One : Digit
{
    public One()
    {
        this.N = 1;
    }
    // i want my own output
    public override string Print()
    {
        return string.Format("{0}", this.N);
    }
}

public class Two : Digit
{
    public Two()
    {
        this.N = 2;
    }
    // i will use the default output!
}
创建两个对象并调用“打印”时:

var one = new One();
var two = new Two();
System.Console.WriteLine(one.Print());
System.Console.WriteLine(two.Print());
输出为:

1
I am base digit: 2
EF中的延迟计算不是来自虚拟关键字direct,而是来自关键字启用的覆盖可能性(同样来自延迟加载):

当预定义的方法被重写时,程序员可以启用延迟加载

1
I am base digit: 2
When using POCO entity types, lazy loading is achieved by creating 
instances of derived proxy types and then overriding virtual 
properties to add the loading hook.