c# - 将 EF 实体映射到维护 ICollection 和延迟加载的 ViewModel

标签 c# entity-framework repository-pattern

自从转移到 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/

相关文章:

c# - 接口(interface)实现在函数中有一个额外的参数

sql-server - 所有实体都继承自一个主基表的优缺点是什么?

java - 存储库搜索中带有对象与参数列表的方法。违反建议零售价?

entity-framework - 存储库模式和 Entity Framework

c# - 为什么我会收到 System.OutOfMemoryException

c# - 从 C# 的 Regex.Matches 返回的数组顺序是否保证按文本顺序排列?

c# - 是将要从 main() 调用的所有方法声明为静态的还是创建一个包含包括 main 在内的所有方法的类的对象更好?

c# - 通过字符串生成EF orderby表达式

c# - OriginalValues 不能用于处于已添加状态的实体

c# - 在连接 LINQ 中使用多个条件。我,我和