1

我正在开发一个需要更新 Entity Framework 5 的项目。这需要对实体和配置类(代码优先)进行一些细微的更改,以使数据层保持最新状态。升级完成,只剩下一个实体。对此实体执行查询时,我收到以下错误:

System.InvalidOperationException: 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.

该实体对包含两个可选外键的表进行建模,这些外键与数据库中的另一个表相关。

这是数据库中表的一部分(首先,有问题的表):

LocationMap                  Location
-----------                  --------
Id (PK, not null)            Id (PK, not null)
SourceId (FK, null)          ...
TargetId (FK, null)

在此模型中,LocationMap.SourceId 和 LocationMap.TargetId 都引用 Location.Id。这是用于在我的数据层中表示这种关系的实体和配置类的一部分:

public class LocationMap
{
    public int Id { get; set; }
    public int SourceId { get; set; }
    public int TargetId { get; set; }
    ...

    public virtual Location Source { get; set; }
    public virtual Location Target { get; set; }
}

public class Location
{
    public int Id { get; set; }
    ...

    public virtual ICollection<LocationMap> TargetMaps { get; set; }
    public virtual ICollection<LocationMap> SourceMaps { get; set; }
}

public LocationMapConfiguration()
{
    HasKey(x => x.Id);

    HasRequired(map => map.Source)
        .WithMany(location => location.SourceMaps)
        .HasForeignKey(map => map.SourceId)
        .WillCascadeOnDelete(false);

    HasRequired(map => map.Target)
        .WithMany(location => location.TargetMaps)
        .HasForeignKey(map => map.TargetId)
        .WillCascadeOnDelete(false);
}

public LocationConfiguration()
{
    HasKey(x => x.Id);
    ...
}

运行以下代码时...

using (var context = new MyDbContext())
{
    var map = context.LocationMaps
                     .FirstOrDefault();

    Logger.Info("Source name: {0}", map.Source.Name);
    Logger.Info("Target name: {0}", map.Target.Name);
}

... map.Source.Name 有效,而 map.Target.Name 产生上述异常。如何调用这两个映射并不重要——Source 始终有效,Target 始终抛出异常。

原始的 Location 实体类没有定义 ICollection 导航属性,实际上是我在创建更新的数据层时设置它的方式。正是在研究多个来源(包括这里的几个)涉及以示例中显示的方式实现导航属性的解决方案的例外情况。因此,我添加了它们,但它并没有解决我的问题。

像往常一样,对此的任何帮助将不胜感激。

谢谢!

4

0 回答 0