Ограничение множественности нарушено. Роль 'Contract_Subscription_Target' отношения 'Contract_Subscription' имеет кратность 1 или 0..1
Я пытаюсь сохранить некоторые объекты в базу данных, когда я получаю сообщение об ошибке выше. Все, что я гуглил и искал, еще не привело к чему-то полезному, поэтому вопрос здесь.
Код, где он идет не так:
foreach (Contract con in sub.Contracts.Where(c => !c.Approved))
{
con.Approved = true;
DatabaseHelper.db.Contracts.Add(con);
}
Контракт класса:
public class Contract
{
public int ID { get; set; }
public int SubscriptionID { get; set; }
public int? AdministrationID { get; set; }
[Required]
[DataType(DataType.Text)]
public string Name { get; set; }
[Required]
[DataType(DataType.Text)]
public string Description { get; set; }
[Required]
[DataType(DataType.Date)]
public DateTime BeginDate { get; set; }
public DateTime EndDate { get; set; }
[Required]
public Boolean Periodically { get; set; }
[Required]
public Boolean Approved { get; set; }
[Required]
public double Amount { get; set; }
[InverseProperty("Contracts")]
[ForeignKey("SubscriptionID")]
public virtual Subscription Subscription { get; set; }
[ForeignKey("AdministrationID")]
public virtual Administration Administration { get; set; }
public Contract()
{
Approved = false;
BeginDate = (DateTime)SqlDateTime.MinValue;
EndDate = (DateTime)SqlDateTime.MinValue;
}
}
И класс подписки:
public enum Status
{
REGISTERED, AUTHORIZED, ADMSELECT, SETTINGSCOMPLETE, TRIAL, FULL
}
public enum Process
{
REGISTERING, CHANGESETTINGS, REGISTERED, UNAUTHORIZED, CANCELLED
}
public class Subscription
{
public int ID { get; set; }
[ForeignKey("Customer")]
public int CustomerID { get; set; }
[ForeignKey("App")]
public int AppID { get; set; }
[DataType(DataType.Text)]
public string ExactFullName { get; set; }
[DataType(DataType.Text)]
public string ExactUserID { get; set; }
[DataType(DataType.Text)]
public string ExactUserName { get; set; }
[DataType(DataType.EmailAddress)]
public string ExactUserEmail { get; set; }
[DataType(DataType.Text)]
public string ExactLanguageCode { get; set; }
[DataType(DataType.Text)]
public string ExactCurrentDivision { get; set; }
[DataType(DataType.Text)]
public string BankAccount { get; set; }
public Boolean PaymentInfoNeeded { get; set; }
[Required]
[DataType(DataType.Date)]
public DateTime SubscribedAt { get; set; }
[Required]
[DataType(DataType.Date)]
public DateTime PaidForTill { get; set; }
[DataType(DataType.Date)]
public DateTime DeprovisioningDate { get; set; }
[DataType(DataType.Date)]
public DateTime EndContractDate { get; set; }
[DataType(DataType.Text)]
public string AuthorizationCode { get; set; }
[DataType(DataType.DateTime)]
public DateTime AuthorizationDate { get; set; }
[DataType(DataType.Text)]
public string RefreshToken { get; set; }
[DataType(DataType.Text)]
public string AuthorizationToken { get; set; }
[DataType(DataType.DateTime)]
public DateTime tokenExpiresAt { get; set; }
public Status Status { get; set; }
public Process Process { get; set; }
public Boolean AutoSubscribe { get; set; }
public Boolean Incasso { get; set; }
public Boolean AgreeTerms { get; set; }
public Boolean Copy { get; set; }
public virtual Customer Customer { get; set; }
public virtual App App { get; set; }
public virtual ICollection<Administration> Administrations { get; set; }
public virtual ICollection<SubscriptionSetting> Settings { get; set; }
[InverseProperty("Subscription")]
public virtual ICollection<Contract> Contracts { get; set; }
// some more constructors
Ошибка возникает, когда я пытаюсь добавить дополнительный Контракт с той же Подпиской. В ситуации у меня есть 2 контракта, которые уже добавлены и являются экземплярами прокси, и 2 контракта, которые все еще являются модельными экземплярами. Когда я начинаю добавлять экземпляры модели, выдается ошибка. Странно то, что мои прокси-экземпляры также имеют ту же подписку, на которую указывает, и это не выдает ошибку. Единственное, о чем я могу думать, это то, что модель, которую пытаются добавить, также имеет то же имя и Администрацию.
Я надеюсь, что кто-нибудь знает решение этой проблемы. У меня есть небольшая идея, что Entity Framework не распознает мои отношения один-ко-многим между подпиской и контрактом. Почему он не признает эти отношения, я не понимаю.
спасибо заранее!
1 ответ
Хорошо, я ухватился за решение, когда ездил на велосипеде к своей работе сегодня.
В моем приложении я получил двустороннюю привязку. Я обновил привязку на стороне Подписки, скопировав Контракты подписки на дубликаты, не прикрепленные к базе данных, к Подписке, прикрепленной к базе данных.
Что я не заметил, так это то, что Подписка на позиции Контракта все еще оставалась неприкрепленной Подпиской. Поэтому, когда я пытался добавить Контракт в базу данных, EF каскадно пытался добавить неподключенную Подписку в базу данных. Это, конечно, тогда не имеет смысла, так как один Контракт имеет несинхронизированное связывание. EF выдавала ошибку множественности, так как Подписка, которую она добавляла вместе с Контрактом, нарушила ограничение множественности, поскольку две Подписки теперь ссылались на один и тот же Контракт.