Возникли проблемы с исправлением зависимых и основных ролей в ограничении отношений, которые должны быть идентичны друг другу.

Я пытаюсь создать составной ключ со всеми FK. Для уникальности мне нужно 4 свойства. Я добавил два, но третий FK и четвертый FK выдают ошибки, так как они из одной таблицы, и я не знаю, как это настроить?

Я прочитал много ответов, и я просто не вижу, как это написать. Я работаю над веб-приложением ASP.Net MVC с Entity Framework, и я изучил их:

https://www.entityframeworktutorial.net/code-first/foreignkey-dataannotations-attribute-in-code-first.aspx

https://www.entityframeworktutorial.net/code-first/inverseproperty-dataannotations-attribute-in-code-first.aspx

Определение нескольких внешних ключей для Та же таблица в Entity Framework Code First

Сначала код Entity Framework - два внешних ключа из одной таблицы< /а>

https://forums.asp.net/t/2135907.aspx?Multiple+Relationships+Foreign+Keys+Between+Two+Tables+in+Classes+

https://febdev.wordpress.com/2013/01/30/entity-framework-mapping-references-with-composite-keys/

Отношение Entity Framework First One-to-One на композите ключ

Одна проблема в том, что я никогда не работал с конструктором моделей, поэтому ответ, который я получил с другого сайта, был просто ссылками, но это мне мало помогло.

public class TradeJournal
{
    [Key, Column(Order = 0)]
    public int UserID { get; set; }
    [ForeignKey("UserID")]
    public UserAccount UserAccount { get; set; }

    [Key, Column(Order = 1)]
    public int AccountNumber { get; set; }
    [ForeignKey("AccountNumber")]
    public FxAccount FxAccount { get; set; }

    [Key, Column(Order = 2)]
    [ForeignKey("OpenTime")]
    public string OpenTime { get; set; }
    public HistoricalTrade Open { get; set; }

    [Key, Column(Order = 3)]
    [ForeignKey("CloseTime")]
    public string CloseTime { get; set; }
    public HistoricalTrade Close { get; set; }
}

public class HistoricalTrade
{
    [Key, Column(Order = 0)]
    public int UserID { get; set; }
    [ForeignKey("UserID")]
    public UserAccount UserAccount { get; set; }

    [Key, Column(Order = 1)]
    public int AccountNumber { get; set; }
    [ForeignKey("AccountNumber")]
    public FxAccount FxAccount { get; set; }

    [Key, Column(Order = 2)]
    [JsonProperty("openTime")]
    public string OpenTime { get; set; }

    [Key, Column(Order = 3)]
    [JsonProperty("closeTime")]
    public string CloseTime { get; set; }
}

Миграция базы данных вызвала указанную выше ошибку или «OpenTime не является допустимым объектом. (что-то вроде) Ключ должен быть допустимым объектом с неабстрактным методом получения и установки.

Мне нужно, чтобы ключ был указанным четырьмя свойствами. Спасибо.

Изменить: я переместил "ForeignKey("OpenTime") и "CloseTime" выше ссылочного свойства, и полная ошибка, о которой я упоминал, исходит из заголовка, а именно:

Во время создания модели были обнаружены одна или несколько ошибок проверки:

TradeJournal_Close_Target_TradeJournal_Close_Source: : количество свойств в зависимой и основной ролях в ограничении отношения должно быть одинаковым.

РЕДАКТИРОВАТЬ: я попробовал свои силы в свободном API, как было предложено, и столкнулся с новой ошибкой: «SqlException: оператор INSERT конфликтует с ограничением FOREIGN KEY. Это произошло db.SaveChanges();. Моя попытка Fluent API такова:

  protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<TradeJournal>()
               .HasKey(k => new { k.UserID})
               .HasRequired(r => r.User);

            modelBuilder.Entity<TradeJournal>()
               .HasKey(k => new { k.AccountNumber })
               .HasRequired(r => r.Account);

            modelBuilder.Entity<TradeJournal>()
              .HasKey(k => new { k.OpenTime })
              .HasRequired(r => r.Open);

            modelBuilder.Entity<TradeJournal>()
              .HasKey(k => new { k.CloseTime })
              .HasRequired(r => r.Close);
        }

person JuniorExtreme    schedule 02.05.2019    source источник
comment
Просто для записи, одна из моих размещенных ссылок может ответить на мой вопрос, и я просто не понимаю, как это реализовать?   -  person JuniorExtreme    schedule 02.05.2019
comment
Если вы получаете сообщение об ошибке, пожалуйста, покажите нам точное сообщение об ошибке.   -  person ESG    schedule 02.05.2019
comment
@ESG Это текущий: свойство «OpenTime» не может быть настроено как свойство навигации. Свойство должно быть допустимым типом сущности, а свойство должно иметь неабстрактный метод получения и установки. Для свойств коллекции тип должен реализовывать ICollection‹T›, где T — допустимый тип сущности. Это другой, который я упомянул. Первоначальный был заглавным, полной формулировки которого у меня сейчас нет.   -  person JuniorExtreme    schedule 02.05.2019
comment
Вы можете поделиться OpenTime классом?   -  person ilkerkaran    schedule 02.05.2019
comment
@ilkerkaran OpenTime является собственностью HistoricalTrade, третьего ключа. Я пытаюсь сослаться на FK на эту информацию в TOne. OpenTime исходит из вызова API, который придает ему ценность.   -  person JuniorExtreme    schedule 02.05.2019
comment
Вы можете переместить [ForeignKey("OpenTime")] выше строки public HistoricalTrade Close { get; set; }? и вы можете найти дополнительную информацию об атрибуте ForeignKey entityframeworktutorial .net/код-первый/   -  person ilkerkaran    schedule 02.05.2019
comment
@ilkerkaran Итак, я пробовал это, что приводит к ошибке CloseTime. Если я сделаю это для обоих, это будет ошибка (та, что упомянута в заголовке, так что теперь она у меня есть, лол): одна или несколько ошибок проверки были обнаружены во время создания модели: TradeJournal_Close_Target_TradeJournal_Close_Source:: количество свойств в зависимом и основном Роли в ограничении отношения должны быть идентичными.   -  person JuniorExtreme    schedule 02.05.2019
comment
Я думаю, вы пропустите некоторые ключи, чтобы соответствовать. Вам нужно сопоставить HistoricalTrade.AccountNumber (с атрибутом Key) со свойством FK в TradeJournal. Кстати, на вашем месте я бы точно использовал fluent API.   -  person ilkerkaran    schedule 02.05.2019
comment
@ilkerkaran Поэтому я изменил ссылку на HistoricalTrade вместо FxAccount и назвал ее Account. Теперь все три из них появляются как ошибка. Я еще раз попробую Fluent API и посмотрю, смогу ли я понять и внедрить его сегодня. В прошлый раз у меня была проблема: заставить его работать с FK, будучи один на один.   -  person JuniorExtreme    schedule 02.05.2019
comment
@JuniorExtreme составной ключ — это ключевое слово для решения вашей проблемы. Я считаю, что stackoverflow.com/questions/47394333/ решит вашу проблему   -  person ilkerkaran    schedule 02.05.2019
comment
@ilkerkaran Итак, я столкнулся с новой ошибкой. Я попробовал свои силы в Fluent API и собираюсь отредактировать вопрос, чтобы показать, что у меня есть, и новую всплывающую ошибку.   -  person JuniorExtreme    schedule 03.05.2019
comment
@JuniorExtreme Я думаю, вы упускаете из виду пункт HasKey. Это означает, что preoperty является ключом этого объекта. Переведите в БД, этот столбец является первичным ключом. Если у вас есть составной ключ, вы должны действовать следующим образом; .HasKey(k => new { k.UserID,k.AccountNumber,k.OpenTime, k.CloseTime}) вот как ef будет теперь, когда объект имеет составной ключ   -  person ilkerkaran    schedule 03.05.2019