Как использовать несколько таблиц с одним и тем же внешним ключом в Entity Framework - PullRequest
0 голосов
/ 24 февраля 2019

Мне нужно определить мои 3 класса следующим образом:

public class Table1
{
   public Guid Table1CoreId {get;set;}
   public string Name {get;set;}

   public Table2 Table2 {get;set;}
   public Table3 Table3 {get;set;}
}

public class Table2
{
   Guid Table1CoreId {get;set;}
}

public class Table3
{
   Guid Table1CoreId {get;set;}
}

Как вы можете видеть, я определил Table2 и Table3 как свойства в Table1.

Я пытался использоватьEF свободно API, чтобы определить, как они должны быть созданы, но я не получаю желаемый результат.Мне нужно, чтобы моя таблица была определена следующим образом:

Table1:

  • Table1CoreId (PK)
  • Имя

Table2:

  • Table1CoreId (PK, FK)
  • Id (PK)

Table3:

  • Table1CoreId (PK, FK)
  • Id (PK)

Table2 имеет отношение 1 к 1 с Table1, в то время как Table3 имеет отношение 1 к M.Обе записи в таблице 2 и таблице 3 являются необязательными.

Я пробовал следующее: в используемых классах определения таблиц 2 и 3 я использовал следующее:

this.HasRequired(t => t.Table1)
    .WithMany()
    .HasForeignKey(t => t.Table1CoreId)
    .WillCascadeOnDelete(false);

Но когда ясоздайте миграцию и обновите мою базу данных, она создает дополнительные столбцы в таблице 1:

Table2_Table1CoreId
Table2_Id
Table3_Table1CoreId
Table3_Id

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

Надеюсь, это имеет смысл, и кто-то может указать мне правильное направление, как решить эту проблему.

1 Ответ

0 голосов
/ 25 февраля 2019

После дальнейшего обсуждения этого вопроса с моим коллегой мы закончили нормализацию нашей таблицы, поэтому мы ввели одну дополнительную таблицу, а также сняли требование иметь одну из таблиц, имеющих отношение 1 к m, поэтому всестолы теперь 1 к 1.Все эти изменения значительно упростили определение наших классов, а также упростили решение проблем EF.

Окончательные изменения следующие:

public class Table1
{
    public Guid Table1CoreId {get;set;}
    public string Name {get;set;}
}

public class Table2
{
   Guid Table1CoreId {get;set;}
   int  Table2CoreId {get;set;}
}

public class Table3
{
   Guid Table2CoreId {get;set;}
}

public class Table4
{
   Guid Table2CoreId {get;set;}
}

В классе конфигурации Table2 я добавил следующее:

public class Table2Configuration : EntityTypeConfiguration<Table2>
{
    ...
    this.HasOptional(t => t.Table3)
        .WithRequired(o => o.Table2)
        .WillCascadeOnDelete(true);

    this.HasOptional(t => t.Table4)
        .WithRequired(o => o.Table2)
        .WillCascadeOnDelete(true);
}

и наши таблицы теперь выглядят так:

Table1:

  • Table1CoreId (PK)
  • Имя

Table2:

  • Table1CoreId (PK, FK)
  • Table2CoreId

Table3:

  • Table2CoreId (PK, FK)
  • Id (PK)

Table4:

  • Table2CoreId (PK, FK)
  • Id (PK)

И, как первоначально было запрошено, дополнительныхполя, добавленные в таблицу 1.

Примечание: Исходя из моего исходного вопроса, мне удалось решить проблему с дополнительными полями, добавив атрибут [ForeignKey ("Table1CoreId, Id")] к обоимСвойства навигации (т. Е. Table2 и Table3), определенные в Table1, но так и не удалось разрешить их с помощью EF Fluent API, поскольку в итоге мы переработали классы и таблицы.

...