0

я имею проблему с помощью Entity Framework-6. Я два классаКратность нарушение ограничения EF Code First-

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 как в этом примере (в это время элементы reachedStates отсоединяются)

using (IDataLayer db = StorageFactory.GetStore()) 
{ 
    ProcessInstance ix = db.GetProcessInstance(processInstanceId); 
    ix.LinkableStates = reachedStates; 
} 

если БД OBE jct get расположен и сохранен. Я получаю сообщение об ошибке

Нарушение множественности. Роль 'ProcessInstance_LinkableStates_Source' отношения 'DataLayer.Mssql.DataBase.ProcessInstance_LinkableStates' имеет кратность 1 или 0..1.

Я не знаю, почему EF думает, что существует более 1 отношения? Я проверил файл EDMX (обратный из Code-First), который выглядит следующим образом:

Reverse EDMX Db-Entries

Как вы можете видеть в ДБ-записей ключ ProcessInstance_Id (ProcessInstance.LinkableStates) был обнуляется, даже если идентификатор {1, 3} должен быть установлен с помощью Process.Id = 1.

Эта ошибка произошла пока я перешел от

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); 
    } 
} 

но это ничего не меняет.

У вас есть идеи, как я могу исправить эту проблему?

заранее спасибо :)

ответ

2

Ладно, кажется, я решил эту проблему.

Я сделал две вещи. Во-первых, я добавил InverseProperty аннотацию к моим классам

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 вручную перед я сохранить их и проверить наличие уже сохраненной версии первой.

foreach (LinkableState e in copy) 
{ 
    LinkableState tmp = db.GetLinkableState(e.Id) ?? e; 
    tmp.LinkableStatesId = ix.Id; 
    ix.LinkableStates.Add(tmp); 
} 

на данный момент это решило мою ошибку «Ограничение ограничения множественности». Надеюсь, это поможет кому-то еще столкнуться с этой проблемой.