我使用Entity-Framework 6时遇到了问题。我有两个类
public class LinkableState : Entity
{
[Required]
public long LinkableId { get; set; }
[ForeignKey(@"LinkableId")]
public virtual Linkable Linkable { get; set; }
public long Counter { get; set; }
public string Debug { get; set; }
}
和
public class ProcessInstance : InstanceBase<Process>
{
[Required]
public DateTime InstanceStartTime { get; set; }
public DateTime? InstanceEndTime { get; set; }
public ProcessInstanceState InstanceEndState { get; set; } = ProcessInstanceState.None;
public virtual ICollection<LinkableState> LinkableStates { get; set; } = new List<LinkableState>();
public virtual ICollection<LinkableState> LinkableStateTopCounter { get; set; } = new List<LinkableState>();
}
在我的代码中,我喜欢像这个例子中那样更改ProcessInstance.LinkableStates(此时已经分离了reachStates的元素)
using (IDataLayer db = StorageFactory.GetStore())
{
ProcessInstance ix = db.GetProcessInstance(processInstanceId);
ix.LinkableStates = reachedStates;
}
如果db obejct得到处理并保存我得到错误
违反了多重性约束。角色 'ProcessInstance_LinkableStates_Source'的关系 'DataLayer.Mssql.DataBase.ProcessInstance_LinkableStates'有 多重性1或0..1。
我不知道为什么EF认为有超过1个关系?我检查了EDMX文件(从Code-First反向),如下所示:
正如您在db-entries中看到的那样,即使应使用Process.Id = 1设置ID {1,3},ProcessInstance_Id(ProcessInstance.LinkableStates)的键也已为空。
我从
切换时发生此错误Configuration.ProxyCreationEnabled = true;
Configuration.LazyLoadingEnabled = true;
到
Configuration.ProxyCreationEnabled = false;
Configuration.LazyLoadingEnabled = false;
当我从懒惰切换到急切加载时,我绝对不知道为什么会出现这个错误。我已经尝试清除列表并手动添加新元素,如:
using (IDataLayer db = StorageFactory.GetStore())
{
ProcessInstance ix = db.GetProcessInstance(processInstanceId);
ix.LinkableStates.Clear();
foreach (LinkableState e in unvisitedStates)
{
ix.LinkableStates.Add(e);
}
}
但这并没有改变任何事情。
你有什么想法我可以解决这个问题吗?
提前感谢:)
答案 0 :(得分:2)
好吧,好像我已经解决了这个问题。
我做了两件事。首先,我已将InverseProperty Annotation添加到我的类
public class LinkableState : Entity
{
...
public long? LinkableStatesId { get; set; }
public long? LinkableStateTopCounterId { get; set; }
[InverseProperty(@"LinkableStates")]
[ForeignKey(@"LinkableStatesId")]
public virtual ProcessInstance ProcessInstanceLinkableStates { get; set; }
[InverseProperty(@"LinkableStateTopCounter")]
[ForeignKey(@"LinkableStateTopCounterId")]
public virtual ProcessInstance ProcessInstanceLinkableStateTopCounter { get; set; }
}
public class ProcessInstance : InstanceBase<Process>
{
...
[InverseProperty(@"ProcessInstanceLinkableStates")]
public virtual ICollection<LinkableState> LinkableStates { get; set; } = new List<LinkableState>();
[InverseProperty(@"ProcessInstanceLinkableStateTopCounter")]
public virtual ICollection<LinkableState> LinkableStateTopCounter { get; set; } = new List<LinkableState>();
}
,第二件事是我在保存之前手动为LinkableStates设置引用ID,并首先检查已存储的版本。
foreach (LinkableState e in copy)
{
LinkableState tmp = db.GetLinkableState(e.Id) ?? e;
tmp.LinkableStatesId = ix.Id;
ix.LinkableStates.Add(tmp);
}
现在这解决了我的“Multiplicity约束违规”错误。 希望这会帮助其他人面对这个问题。