C # EntityCode First: нежелательный внешний ключ создан - PullRequest
0 голосов
/ 27 августа 2018

У меня есть таблица «Заявлений», которая связана с обоими:

  • таблица «Транзакций» (с внешним ключом на IdStatement)
  • таблица «Конкретные транзакции». Класс «SpecificTransaction» наследуется от таблицы «Transaction»

Это существующий код First Model:

  1. Табличная выписка

    [Serializable]
    [Table("Statement", Schema = "dbo")]
    public class Statement
    {
        public Statement()
        {
            this.Transactions = new List<Transaction>();
            this.SpecificTransactions = new List<SpecificTransaction>();
        }
    
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int IdStatement { get; set; }
    
        public List<Transaction> Transactions { get; set; }
        public List<SpecificTransaction> SpecificTransactions { get; set; }
    
        [... Other properties ...]
    }
    
  2. Таблица транзакций

    [Serializable]
    [Table("Transaction", Schema = "dbo")]
    public class Transaction
    {
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int IdTransaction { get; set; }
    
        [ForeignKey("Statement")]
        public Nullable<int> IdStatement { get; set; }
    
        [... Other properties ...]
    
    }
    
  3. Таблица SpecificTransaction (наследуется от Transaction)

    [Serializable]
    [Table("SpecificTransaction", Schema = "dbo")]
    public class SpecificTransaction : Transaction
    {
    
        [StringLength(255)]
        public string UniqueValue { get; set; }
    
        [StringLength(50)]
        public string Status { get; set; }
    
        [StringLength(50)]
        public string Hash { get; set; }
    
        [... Other properties ...]
    
    }
    

Когда создается база данных, в мою таблицу SpecificTransaction добавляется нежелательное поле (т.е. столбец), которое называется «Statement_IdStatement».

Когда я пытаюсь добавить свое заявление, содержащее SpecificTransactions, ни один из следующих столбцов:

  • Таблица транзакций> Столбец IdStatement
  • Таблица SpecificTransaction> Столбец Statement_IdStatement

Заполняется IdStatement, я должен добавить Id позже.

Кроме того, когда я присваиваю «IdStatement» в моей таблице «SpecificTransaction», заполняется только столбец «Statement_IdStatement», а не «IdStatement» моего оператора таблицы.

Есть ли способ:

  • избежать создания столбца "Statement_IdStatement" и сохранения моего кода EF. Первый класс таким образом? (или, по крайней мере, не вносить изменений в таблицы выписка и транзакция)

  • Когда я добавляю свои выписки, содержащие SpecificTransactions, и я сохраняю изменения, столбец «Транзакция»> «IdStatement» заполняется автоматически?

Заранее спасибо.

1 Ответ

0 голосов
/ 27 августа 2018

Вы получаете дополнительный столбец Statement_IdStatement, поскольку вы объявили второе отношение непосредственно между типами моделей Statement и SpecificTransaction, а именно свойством public List<SpecificTransaction> SpecificTransactions в вашем классе Statement. Этого достаточно, чтобы Entity Framework создал дополнительный столбец таблицы для сопоставления этого отношения «один ко многим», и поэтому оно заполняется. Это не обязательно должно быть сопоставлено с дополнительным свойством модели с внешним ключом, чтобы это произошло.

Возможно, вам не нужно это дополнительное свойство на Statement. На самом деле вы можете вставить SpecificTransaction объекты в список Transactions, и сопоставление позаботится о вас.

Возможно, вы объявили это свойство, чтобы иметь доступ только к SpecificTransaction объектам для вашего Statement. Если это было ваше намерение, вы можете альтернативно получить к ним доступ, используя myStatement.Transactions.OfType<SpecificTransaction>().

...