我正在开发一个需要更新 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 导航属性,实际上是我在创建更新的数据层时设置它的方式。正是在研究多个来源(包括这里的几个)涉及以示例中显示的方式实现导航属性的解决方案的例外情况。因此,我添加了它们,但它并没有解决我的问题。
像往常一样,对此的任何帮助将不胜感激。
谢谢!