【发布时间】:2016-08-15 23:55:22
【问题描述】:
自从转向 EF 6 以来,这一直困扰着我。我们现在如何将集合映射到视图模型,以便使用 IEnumerables 映射更改不会很痛苦。下面是一个代码 sn-p,演示了我的问题:
实体 - SS.Entity.Event
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<SS.Entity.User> Broadcasters { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<SS.Entity.User> Viewers { get; set; }
模型 - SS.Model.Event
public virtual ICollection<SS.Model.User> Broadcasters { get; set; }
public virtual ICollection<SS.Model.User> Viewers { get; set; }
集合修改后映射回实体
Broadcasters = e.Broadcasters.Select(u => new SS.Entity.User
{
Id = u.Id,
SkypeId = u.SkypeId,
Name = u.Name
}).ToList(), // THIS IS THE PROBLEM
Viewers = e.Viewers.Select(u => new SS.Entity.User
{
Id = u.Id,
SkypeId = u.SkypeId,
Name = u.Name
}).ToList() // THIS IS THE PROBLEM
这个问题是我不能将一个 ICollection 映射到另一个 ICollection,因为 Select 会产生一个 IEnumerable,这使得在之后将属性映射回 EF 变得很痛苦,因为我必须重新创建集合或枚举它来更新它。我知道我遗漏了一些明显的东西,我已将 ICollection 更新为虚拟的,如其他答案中所述,但我不清楚这有什么帮助。
任何帮助将不胜感激!
杰拉德
【问题讨论】:
-
为什么不
Broadcasters = e.Broadcasters?很不清楚你在问什么。有一个User类,还是两个?延迟加载与此有何关系? -
我试图通过添加命名空间使其更清晰。本质上,我的问题是如何在 EF6 中映射回集合更改。如果没有 ToList(),我看不到明确的方法可以做到这一点。因此,在处理大型集合时会严重影响性能。
-
"....将集合映射到视图模型,以便使用 IEnumerables 映射更改不会很痛苦".....这不清楚。 “地图收藏通过”是什么意思。如您的帖子所示,您正在从您的 DTO 创建新类型.....为什么这对您不起作用?
-
您是否正确构建了视图模型?您可以使用这种方法大大简化它们:stackoverflow.com/questions/11064316/what-is-viewmodel-in-mvc/…
-
我不明白您希望如何在没有枚举的情况下执行转换(一种用户类型到另一种)。唯一的“挑战”是确保您只枚举一次。也许您不应该将大型收藏品带入客户。客户应该如何处理它们?
标签: c# entity-framework repository-pattern