OvrLrdFregus Ответов: 1

Создание составного ключа с несколькими внешними ключами из одной таблицы EF code first


Привет всем,

У меня возникла проблема с кодом сначала на EF6.

Я получаю эту ошибку при попытке создать миграцию "количество свойств в зависимой и основной ролях в ограничении отношений должно быть одинаковым."

Вот этот код:

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 HistoricalTrades { get; set; }

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

       public byte[] Image { 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; }



  }


Я пытаюсь создать составной ключ,состоящий из двух внешних ключей (Openstime, CloseTime), ссылающихся на одну и ту же таблицу (HistoricalTrade).
Я схожу с ума, лол.
Это была моя последняя попытка сделать так, чтобы на historicalTrade ссылались дважды, один с буквой s и один без нее.В данный момент я делаю все, что угодно.
У кого-нибудь есть идея, как исправить эту проблему? А для получения бонусных баллов объясните ошибку, которую я получаю, в более простых терминах, чтобы я мог узнать, на что ссылаются(т. е. что такое зависимая роль, основная роль и ограничение отношений (хотя я предполагаю, что это просто FKs)?).

Я действительно чувствую, что один из моих ресурсов "пробовал", возможно, имел ответ, который я просто не реализовал правильно просто потому, что не понял, как его реализовать :/

Что я уже пробовал:

Читающий эту DataAnnotations - атрибут ForeignKey в ядре EF 7 & EF[^]

Читающий эту DataAnnotations - атрибут InverseProperty в коде-первый[^]

И этот тоже : asp.net mvc - определение нескольких внешних ключей для одной и той же таблицы в коде Entity Framework First - Stack Overflow[^]

А это :c# - код Entity Framework First - два внешних ключа из одной таблицы - переполнение стека[^]

И это тоже : Множественные отношения/внешние ключи между двумя таблицами (в классах) | ASP.NET форумы[^]

И еще несколько таких постов, на которые у меня больше нет ссылки (или помните, что я набрал для результата поиска).

Я попытался использовать обратное свойство, но в моем конкретном случае это не имело смысла, как это правильно реализовать?
Я изменил его на виртуальный HistoricalTrade и сделал оба внешних ключа = "HistoricalTrade", назвав его, например, HistoricalTrade_OpenTime. Но это не сработало.

Я здесь в растерянности.
Любая помощь будет оценена по достоинству.

1 Ответов

Рейтинг:
1

Gerry Schmitz

У вас есть отношения один-к-одному в соответствии с вашими классами.

Entity Framework – сопоставление ссылок с составными ключами | Feb dev[^]

c# - Entity Framework Code First One to One relationship on composite key - Stack Overflow[^]


OvrLrdFregus

Спасибо за помощь, Джерри!
Это моя новая ошибка:
Свойство 'Openstime' не может быть настроено как свойство навигации. Свойство должно быть допустимым типом сущности и иметь неабстрактные геттер и сеттер. Для свойств коллекции тип должен реализовывать ICollection<t>, где T - допустимый тип сущности.

Это то, что я сделал, пытаясь реализовать modelBuilder, так как я никогда не связывался с Fluent API, так как предпочитал аннотации данных:

охраняемых переопределить недействительными OnModelCreating(DbModelBuilder в modelbuilder)
{
база.OnModelCreating(modelBuilder);

для построения модели.Сущность<tradejournal>()
.HasRequired(Т =&ГТ; Т.HistoricalTrade)
.WithMany()
.HasForeignKey(р =>, новые { стр. Значениями открытия и закрытия, стр. CloseTime });
}

Это находится под ApplicationDbContext, так как первая ссылка сказала поместить его в класс, который наследуется от DbContext, и, насколько я могу судить, это единственный, кто приближается к нему (под IdentityModel, при запуске нового веб-приложения с .net mvc5).

Я сделал что-то не так с этим? Или это новые ошибки, потому что TradeJournal имеет проблему со значениями открытия и закрытия'?