EF 6 Один-к-одному или ноль, когда дочерняя сущность имеет свойство KEY, отличное от родительской сущности KEY - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть сценарий, в котором база данных / таблицы уже существуют, и я не могу их изменить.

Вот модели, которые соответствуют базе данных (в основном):

    public class MainTable
    {
        [Key]
        public int MainID { get; set; }

        public string SomeData { get; set; }

        [ForeignKey("MainID")]
        public virtual ExtendedMainTable ExtendedMainTable { get; set; }
    }

    public class ExtendedMainTable
    {
        // NOTE: This is the auto-incremented PK in the "real" database table
        [Key]
        public int ExtendedMainTableID { get; set; }

        // NOTE: This column does exist in the ExtendedMainTable table and is a FK in the "real" database table
        [Required]
        public int MainID { get; set; }

        public string SomeData { get; set; }

        // NOTE: This was added so devs could not insert a record in the ExtendedMainTable without a MainID
        [ForeignKey("MainID")]
        [Required]
        public virtual MainTable MainTable { get; set; }
    }

Мне нужно смоделировать один-к-одному или ноль, где в ExtendedMainTable есть только 1 или 0 записей для любого данного MainID.

Я могу получить это к работе, переместив атрибут «KEY» из ExtendedMainTableID в MainID в классе ExtendedMainTable, НО, который не соответствует реальной базе данных.
Настоящая база данных имеет PK ExtendedMainTableID и FK MainID для ExtendedMainTable.
Когда они запускают SQL UPDATE для ExtendedMainTable, они делают это, но с использованием PK ExtendedMainTableID.

Таким образом, вопрос заключается в следующем.
Как мне заставить это работать в DataAnnotation или Fluent API без добавления «KEY» в ExtendedMainTable.MainID?

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

modelBuilder.Entity<MainTable>()
    .HasOptional(t => t.ExtendedMainTable)
    .WithMany()
    .HasForeignKey(t => t.MainID);


modelBuilder.Entity<ExtendedMainTable>()
    .HasRequired(t => t.MainTable)
    .WithMany()
    .HasForeignKey(t => t.MainID);


modelBuilder.Entity<MainTable>()
    .HasOptional(t => t.ExtendedMainTable)
    .WithOptionalPrincipal(t => t.MainTable);


[ForeignKey("MainID")]
public virtual ExtendedMainTable ExtendedMainTable { get; set; }


[ForeignKey("MainID")]
public virtual MainTable MainTable { get; set; }

[Required, ForeignKey("MainID")]
public virtual MainTable MainTable { get; set; }
...