C# 这些虚拟表的意义是什么?
如果我使用实体框架导入模式,我的表会得到一些虚拟ICollection表,如果它们在其他表上有外键链接的话。例如:C# 这些虚拟表的意义是什么?,c#,.net,entity-framework,C#,.net,Entity Framework,如果我使用实体框架导入模式,我的表会得到一些虚拟ICollection表,如果它们在其他表上有外键链接的话。例如: Table1 Id | ColumnA Table2 Id | Table1Id_fk | ColumnZ 其中,表1将作为此模型导入: public class Table1 { public Table1() { Table2s = new HashSet<Table2>(); } public int Id {
Table1
Id | ColumnA
Table2
Id | Table1Id_fk | ColumnZ
其中,表1将作为此模型导入:
public class Table1
{
public Table1()
{
Table2s = new HashSet<Table2>();
}
public int Id { get; set; }
public string ColumnA { get; set; }
public virtual ICollection<Table2> Table2s { get; set; } // added because of the fk on Table2
}
如果我将对象序列化为字符串响应,这样我就可以看到一个空的Table2s:[]在那里,我想知道这是否与此有关,但我的主要问题是
为什么会发生这种情况?重点是什么?我可以删除它们,但它不会停止工作,到目前为止,它只是让我的代码变得混乱,因为我不知道它们的用途://实体框架基本上为您提供了方便。通过这种方式,在代码中,您可以将外键关系视为简单的属性,而无需自己进行连接 如果删除这些虚拟属性,则必须自己连接实体 获取与表1相关的所有表2项目 虚拟财产:
var allTable2s = table1Item.Table2s;
没有:
var allTable2s = dbContext.Table2s.Where(t2 => t2.Table1Id == table1Item.Id);
您还应该看看实体框架文档:。实体框架基本上为您提供了方便。通过这种方式,在代码中,您可以将外键关系视为简单的属性,而无需自己进行连接 如果删除这些虚拟属性,则必须自己连接实体 获取与表1相关的所有表2项目 虚拟财产:
var allTable2s = table1Item.Table2s;
没有:
var allTable2s = dbContext.Table2s.Where(t2 => t2.Table1Id == table1Item.Id);
您还应该看看实体框架文档:。我不确定您是否使用了EF Core,以及在构建模型时它是否成为标准。 但是: 有时,您需要虚拟集合来引用另一个实体,以避免EF一次又一次地重新创建该实体 想象一下你有一张有汽车的桌子 还有一张有小插曲的桌子 想象一下,您的汽车的一个属性是一组小插曲 如果要从Vignette表中检索2个Vignette并将其设置为汽车上的Vignette,EF默认情况下将假定这些Vignette是新实体,并将在数据库中为您创建它们。这可以,用漂亮的话来说。。。不受欢迎 现在,如果你把你的收藏变成虚拟的,它会突然变成EF的导航属性。它告诉EF 嘿,我只想要这方面的小插曲的参考资料 实体 因此,当您从EF上下文中对对象进行排队时,EF将获得实体的所有信息,然后查找引用的实体(本例中为渐晕图),并将它们填充到您的汽车实体中
它还为该系列启用了EF的延迟加载机制。我不确定您是否使用了EF Core,以及在构建模型时它是否成为标准。 但是: 有时,您需要虚拟集合来引用另一个实体,以避免EF一次又一次地重新创建该实体 想象一下你有一张有汽车的桌子 还有一张有小插曲的桌子 想象一下,您的汽车的一个属性是一组小插曲 如果要从Vignette表中检索2个Vignette并将其设置为汽车上的Vignette,EF默认情况下将假定这些Vignette是新实体,并将在数据库中为您创建它们。这可以,用漂亮的话来说。。。不受欢迎 现在,如果你把你的收藏变成虚拟的,它会突然变成EF的导航属性。它告诉EF 嘿,我只想要这方面的小插曲的参考资料 实体 因此,当您从EF上下文中对对象进行排队时,EF将获得实体的所有信息,然后查找引用的实体(本例中为渐晕图),并将它们填充到您的汽车实体中 它还为该集合启用了EF的延迟加载机制