Ядро EF База данных конкретных столбцов для вложенного объекта - PullRequest
0 голосов
/ 30 октября 2018

У меня есть это:

public class Foo
{
    public int Id { get; set; }
    public Bar Bar { get; set; }
}

public class Bar
{
    public int Something { get; set; }
    public int SomethingElse { get; set; }
}

и моя база данных выглядит так:

CREATE TABLE [Foo](
    [Id]                 INT,
    [Bar_Something]      INT    NOT NULL,
    [Bar_SomethingElse]  INT    NOT NULL,
)

Когда я получаю контекст БД с

public class DB: DbContext
{
    public DbSet<Foo> Foo { get; set; }
}

Foo.Id сопоставлен правильно, но Bar не может быть сопоставлен с этой ошибкой System.InvalidOperationException : The entity type 'Bar' requires a primary key to be defined.

Я не хочу создавать таблицу Bar и указывать ее идентификатор FK для Foo. Как сопоставить столбцы Bar_Something и Bar_SomethingElse с Foo.Bar.Something и Foo.Bar.SomethingElse?

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

первичный ключ, который будет определен в вашем классе Bar.

public class Bar
{
    [Key]
    public int Something { get; set; }
    public int SomethingElse { get; set; }
}
0 голосов
/ 30 октября 2018

EF Core 2.0 и более поздние версии поддерживают Типы собственных объектов . По умолчанию они отображаются с помощью Разделение таблицы .

В EF Core 2.1 вам, вероятно, нужно только добавить атрибут [Owned] к Bar, то есть:

[Owned]
public class Bar
{
    public int Something { get; set; }
    public int SomethingElse { get; set; }
}

Свойства принадлежащего типа будут сопоставлены с полями в той же таблице с именем Property_OwnedProperty. В этом случае это будет Bar_Something и Bar_SomethingElse

Похоже, кто-то разработал таблицу с учетом этих требований.

В EF Core 2.0 вам необходимо указать собственный тип в конфигурации контекста:

modelBuilder.Entity<Foo>().OwnsOne(p => p.Bar);
0 голосов
/ 30 октября 2018

То, что вы, похоже, ищете, - это разделение таблиц - второй сущности Bar все равно потребуется поле идентификатора, хотя это будет то же поле, которое используется для объекта Foo, то есть оно присоединится к ним в 1-1 основа отлично.

Это позволяет сопоставить поле идентификатора таблицы с несколькими объектами, а затем стать как основным, так и внешним ключом для объединения.

Вы можете прочитать об этом более быстрый пример на Здесь в виде довольно простой демонстрации блога.

Это также можно сделать с помощью атрибута [Owned] - разница между использованием принадлежащих и просто сопоставлений двух объектов в одной таблице заключается в том, что принадлежащий объект будет когда-либо только навигационным свойством - поэтому вы не сможете просто посмотреть для Bar вы всегда должны искать Foo и включать Bar.

В зависимости от того, как вы хотите, чтобы они вели себя (независимо или зависимо), у вас есть два варианта разделения таблицы.

...