多重约束违反EF Code-First

时间:2016-02-04 02:38:34

标签: c# sql-server entity-framework ef-code-first eager-loading

我使用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反向),如下所示:

Reverse EDMX Db-Entries

正如您在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);
    }
}

但这并没有改变任何事情。

你有什么想法我可以解决这个问题吗?

提前感谢:)

1 个答案:

答案 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约束违规”错误。 希望这会帮助其他人面对这个问题。