Перекрестное включение одних и тех же табличных отношений в коде EF. Выдает ошибку. Нарушено ограничение множественности. - PullRequest
0 голосов
/ 17 января 2019

У меня есть перекрестные отношения с той же таблицей, в 3-м объекте. При попытке вставить новый объект выдается ошибка:

Нарушено ограничение множественности. Роль 'OrgOwners_Organisation_Target' отношений 'GBankDataSource.OrgOwners_Organisation' имеет кратность 1 или 0..1.

Я пытался комментировать [ForeignKey("...")] в любом из классов, но ничего не произошло. EF всегда выбирает одно поле (OrgRefID в данном примере) и использует его или оба отношения, в то время как OrgID не используется.

public class OrganisationInfo
{
    [Key]
    public int OrgID { get; set; }
...
    public virtual List<OrgOwners> OrgOwners { get; set; } // object that throws error 

}


public class OrgOwners
{
    [Key]
    public int OrgOwnerID { get; set; }

    public int OrgID { get; set; } //Suppose to be a ForeignKey for (OrganisationInfo OrgOwners List)
    public int? OrgRefID { get; set; }
...
    [ForeignKey("OrgRefID")]
    public virtual OrganisationInfo Organisation { get; set; } //(Suppose to use OrgRefID as ForeignKey)

}

Когда я добавляю запись в OrgOwners без организации ( Organisation =null) - все в порядке. Но когда я делаю

var first = new OrganisationInfo (); // Первая организация DB.OrganisationInfoes.Add (first);

var nextOrg = new OrganisationInfo (); // вторая организация

first.OrgOwners = новый список ();

var Owner = new OrgOwners (); Owner.Organsiation = nextOrg;

first.OrgOwners.Add (Владелец); // Добавить владельца со второй организацией к первой.

Я получил ошибку.

Нарушено ограничение множественности.

OrgOwner.Organisation - это НЕ та же информация об организации, что и в корне списка OrgOwners. Это должны быть разные элементы OrganisationInfo, связанные с OrgRefID ForeignKey.

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Полный обработанный пример:

public class OrganisationInfo
{
    [Key]
    public int OrgID { get; set; }
    public virtual List<OrgOwners> OrgOwners { get; set; } 

}

public class OrgOwners
{
    [Key]
    public int OrgOwnerID { get; set; }
    public int OrgID { get; set; }
    public int? OrgRefID { get; set; }

    [ForeignKey("OrgRefID")]
    public virtual OrganisationInfo Organisation { get; set; } 

}



modelBuilder.Entity<OrganisationInfo>()
                    .HasMany(e => e.OrgOwners)
                    .WithRequired() 
                    .HasForeignKey(e => e.OrgID); 
0 голосов
/ 17 января 2019

Это потому, что EF по умолчанию автоматически «объединяет» свойства навигации, где это возможно, для формирования отношений. В вашем случае он связывает OrganizationInfo.OrgOwners свойство навигации коллекции со OrgOwners.Organization справочным свойством навигации, следовательно, берет и использует связанный с ним OrgRefID FK.

Одним из способов решения этой проблемы является добавление второго ссылочного свойства навигации к OrgOwners и связывание его со свойством OrgID через ForeignKey атрибут и OrganizationInfo.OrgOwners свойство навигации коллекции через InverseProperty атрибут:

public int OrgID { get; set; } //Suppose to be a ForeignKey for (OrganisationInfo OrgOwners List)

[ForeignKey("OrgID")]
[InverseProperty("OrgOwners")]
public virtual OrganisationInfo OwnerOrganization { get; set; }

Чтобы сделать это, не изменяя модель сущности, вы должны настроить связь через свободный API:

modelBuilder.Entity<OrganisationInfo>()
    .HasMany(e => e.OrgOwners)
    .WithRequired() // no inverse navigation property
    .HasForeignKey(e => e.OrgID); // <--
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...