Как я могу настроить это отношение в EntityFramework (1 -> много, плюс 1 -> 0 или 1, нет таблицы соединения) - PullRequest
0 голосов
/ 26 января 2019

Мне известно, что реалистичным вариантом является изменение предложенной схемы БД;Я тоже преследую этот вариант.Однако ... Я хотел бы знать, возможно ли настроить EF так, чтобы он понимал эту структуру ....


Бизнес-модель:

  • Every Fooассоциируется с баром.
  • Каждый бар может иметь несколько Foos.
  • Каждый бар может также иметь один специальный Foo (хотя он может не иметь его)

Обеспечение согласованности «особого Foo бара должен быть связан с этим баром» является обязанностью кодовой базы, а не базы данных.

Обеспечение согласованности «бара не может быть болееза одну специальную Foo "в идеале будет отвечать база данных.


Выбранная модель БД:

Как отмечалось выше, я знаю, что существуют и другие возможные структуры с множеством преимуществдля них (не в последнюю очередь «быть проще в настройке в EF»).

CREATE TABLE [dbo].[Foo] (
    [Id] INT IDENTITY (1, 1) NOT NULL,
    [BarId] INT NOT NULL,

    PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_Bar] FOREIGN KEY ([BarId]) REFERENCES [dbo].[Bar] ([Id])
);

CREATE TABLE [dbo].[Bar] (
    [Id] INT IDENTITY (1, 1) NOT NULL,
    [SpecialFooId] INT NULL,

    PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_SpecialFoo] FOREIGN KEY ([SpecialFooId]) REFERENCES [dbo].[Foo] ([Id])
);

Текущая догадка в доменной модели:

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

  // Props for easy 1-many relationship.
  public int BarId { get; set; }
  public virtual Bar Bar { get; set; }
}

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

  // Prop for easy 1-many relationship.
  public virtual ICollection<Foo> Foos { get; set; }

  // Props for hard 1-0..1 relationship.
  public int? SpecialFooId { get; set; }
  public virtual Foo SpecialFoo { get; set; }
}

Я совсем не уверен, чтоэта модель предметного объекта является правильной для EF, и у меня нет слабостейНе знаю, как его настроить.

Кто-нибудь знает, как заставить это работать?

1 Ответ

0 голосов
/ 27 января 2019

По сути, причина, по которой я не смог выполнить эту работу, заключается в том, что описанная выше модель БД НЕ отражена в описанной выше объектной модели домена C #.

Исходя из этой модели БД, одним Foo может быть SpecialFoo из множественных баров - FK от Bar до Foo не знает, что бизнес-логика будет гарантировать, что на самом деле будет не более одного из те ФК, указывающие на любой данный Foo.

Итак, модель класса должна быть:

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

  // Props for easy 1-many relationship.
  public int BarId { get; set; }
  public virtual Bar Bar { get; set; }

  //****** THE CHANGED BIT ******
  public ICollection<Bar> BarsForWhichThisIsTheSpecialFoo { get; set; }  
  //****** THE CHANGED BIT ******
}

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

  // Prop for easy 1-many relationship.
  public virtual ICollection<Foo> Foos { get; set; }

  // Props for hard 1-0..1 relationship.
  public int? SpecialFooId { get; set; }
  public virtual Foo SpecialFoo { get; set; }
}

И тогда правильное заклинание модели-строителя:

    modelBuilder.Entity<Bar>()
        .HasMany(bar => bar.Foos)
        .WithRequired(foo => foo.Bar)
        .HasForeignKey(foo => foo.BarId);
    modelBuilder.Entity<Foo>()
        .HasMany(foo => foo.BarsForWhichThisIsTheSpecialFoo)
        .WithOptional(bar => bar.SpecialFoo)
        .HasForeignKey(bar => bar.SpecialFooId);

Который выражает измененные значения в год. отношений: согласно БД, у Баров на самом деле нет SpecialFoo, принадлежащего им ... У Foos есть коллекция Баров, для которых они Особенные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...