2

我有以下类,我试图将实体对象映射到视图模型:

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;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.

如果我?entity.User.UserName在即时窗口中执行,我会得到预期的用户名值。这里有什么问题?

4

2 回答 2

0

我认为问题可能在于您假设每个用户只有一个消费者,而这对于数据是不正确的。

我遇到了同样的问题,这是因为这种关系是一对多的,而我是一对一的。

于 2013-05-08T23:17:36.920 回答
0

让我解释一下为什么我有这个例外,你也许可以将它与你自己的情况联系起来。我将 EF Code First 模型映射到现有数据库。两个实体之间存在一对多的关系。子表具有由 Id 和 Date 组成的复合主表。但是,我错过了流利地图中主键的第二段:

this.HasKey(t => t.Id);

奇怪的是,模型可以工作,但在某些情况下会抛出异常,很难理解为什么。显然,当 EF 加载子实体的父级时,有不止一个父级,因为键不仅有 ID,还有日期。决议是包括关键的第二部分:

this.HasKey(t => new { t.Id, t.Date });

帮助我查明问题的工具是 EF Power Tools,目前它处于 Beta 3 中。该工具为 EF 上下文类提供了一个上下文菜单,其中一项是查看实体模型 DDL SQL。虽然我可以通过检查代码找到这一点,但该工具很好地显示了 EF 模型与实际数据库的匹配程度。

我相信你会得到这个例外,因为由于某种原因,关系的多样性被违反了。就我而言,这是不正确的映射,在您的情况下,它可能是其他东西,我无法通过查看您的代码来判断。

于 2013-04-20T21:04:43.337 回答