我有以下类,我试图将实体对象映射到视图模型:
public class ConsumerIndexItem: MappedViewModel<Consumer>
{
public string UserName { get; set; }
public string RoleDescription { get; set; }
public override void MapFromEntity(Consumer entity)
{
base.MapFromEntity(entity);
UserName = entity.User.UserName;
}
}
public class Consumer: AuditableEntity
{
public virtual User User { get; set; }
public virtual Role Role { get; set; }
}
public class IndexModel<TIndexItem, TEntity> : ViewModel where TEntity : new()
{
public IndexModel()
{
Items = new List<TIndexItem>();
}
public List<TIndexItem> Items { get; set; }
public virtual void MapFromEntityList(IEnumerable<TEntity> entityList)
{
Items = Mapper.Map<IEnumerable<TEntity>, List<TIndexItem>>(entityList);
}
}
public class ConsumerIndexModel: IndexModel<ConsumerIndexItem, Consumer>
但是,如果我使用以下代码驱动映射:
var model = new ConsumerIndexModel();
var list = _repository.List().Where(c => c.Parent == null).ToList();
model.MapFromEntityList(list);
return View(model);
在UserName = entity.User.UserName;
的{{1}}行上我收到以下异常:
ConsumerIndexItem
如果我在立即窗口中执行A relationship multiplicity constraint violation occurred: An EntityReference can have no more than one related object, but the query returned more than one related object. This is a non-recoverable error.
,我会得到预期的用户名值。这可能有什么问题?
答案 0 :(得分:0)
让我解释为什么我有这个例外,你可以将它与你自己的情况联系起来。我将EF Code First模型映射到现有数据库。两个实体之间存在一对多的关系。子表具有由Id和Date组成的复合主表。但是,我在流畅的地图中错过了第二段主键:
this.HasKey(t => t.Id);
这个奇怪的部分是该模型有效,但在某些情况下抛出异常并且很难理解为什么。显然,当EF加载子实体的父级时,有多个父级,因为密钥不仅具有Id而且还具有Date。决议是包括密钥的第二部分:
this.HasKey(t => new { t.Id, t.Date });
帮助我查明问题的工具是EF Power Tools,目前它处于Beta 3中。该工具为EF上下文类提供了一个上下文菜单,其中一个项目是View Entity Model DDL SQL。虽然我可以通过检查代码找到这个,但该工具很好地展示了EF模型与实际数据库的匹配程度。
我相信你得到了这个例外,因为出于某种原因,违反了多重关系。在我的情况下,这是不正确的映射,在你的可能是其他东西,我无法通过查看你的代码告诉。
答案 1 :(得分:0)
我认为问题可能是您认为每个用户只有一个消费者而这对数据不正确。
我遇到了同样的问题,这是因为这种关系是多对一的,而且我是一对一的。