自从转移到 EF 6 以来,这一直困扰着我。我们现在如何将集合映射到 View 模型,以便使用 IEnumerables 映射回更改并不痛苦。下面是演示我的问题的代码片段:
实体 - 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 更新为虚拟的,如其他答案中所述,但我不清楚这有何帮助。
如有任何帮助,我们将不胜感激!
杰拉德
最佳答案
假设您的“.ToList()”问题是在保存回数据库时出现的,这是您要找的吗?:
var event = new SS.Entity.Event {Name = "New Name" and other properties};
IEnumerable<SS.Entity.User> broadcasters = e.Broadcasters
.Select(u => new SS.Entity.User
{
Id = u.Id,
SkypeId = u.SkypeId,
Name = u.Name
});
var viewers = e.Viewers.Select(u =>
new SS.Entity.User
{
Id = u.Id,
SkypeId = u.SkypeId,
Name = u.Name
});
//add broadcasters to event
event.Broadcasters.AddRange(broadcasters);
//add viewers to event
event.Viewers.AddRange(viewers);
dataContext.Events.Add(event);
dataContext.SaveChanges();
关于c# - 将 EF 实体映射到维护 ICollection 和延迟加载的 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38964683/