Entity Framework Core ChangeTracker - PullRequest
       35

Entity Framework Core ChangeTracker

1 голос
/ 05 марта 2019

Пожалуйста, помогите мне понять странное поведение Entity Framework Core v2.2.2 У меня есть класс Country, который содержит коллекцию регионов, каждый регион ссылается на своего владельца - страну, а также Region может содержать коллекцию подрегионов, каждый подрегион ссылается на свой SuperiorRegion.

См. UML-диаграмму ниже. Модель домена

А вот и код:

класс Страна

public class Country
{
    public Country(string name)
    {
        Name = name;
        Regions = new List<Region>();
    }

    // for EF
    protected Country()
    {
    }

    public int Id { get; set; }

    public string Name { get; set; }

    public IList<Region> Regions { get; set; }

    public Region CreateRegion(string name)
    {
        var region = new Region(name, this);

        Regions.Add(region);

        return region;
    }
}

Класс региона

public class Region
{
    public Region(string name, Country country)
    {
        Name = name;
        Country = country;
        SubRegions = new List<Region>();
    }

    // for EF
    protected Region()
    {
    }

    public int Id { get; set; }

    public string Name { get; set; }

    public Country Country { get; set; }

    public IList<Region> SubRegions { get; set; }

    public Region SuperiorRegion { get; set; }

    public Region CreateSubRegion(string name)
    {
        var region = new Region(name, Country);

        SubRegions.Add(region);
        region.SuperiorRegion = this;

        return region;
    }
}

Затем я создаю дерево (пока все идет хорошо):

var country = new Country("Best Country of the World");
var beachesRegion = country.CreateRegion("Region with beaches");
var hotelsRegion = beachesRegion.CreateSubRegion("Region with hotels");
var workRegion = country.CreateRegion("Region with hard work");

Это структура, которую я получаю: Диаграмма объекта

Проверка:

Console.WriteLine(country.Regions.Count); // 2

А теперь интереснее. Я создаю DbContext…

public class CountryContext : DbContext
{
    public CountryContext(DbContextOptions options) : base(options)
    {
    }

    public DbSet<Country> Countries { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
    }
}

… и подключите к нему страну:

var options = new DbContextOptionsBuilder<CountryContext>()
            .UseInMemoryDatabase(databaseName: "Countries")
            .Options;

using (var db = new CountryContext(options))
{
    db.Countries.Add(country);
}

И на этот раз

Console.WriteLine(country.Regions.Count); //3!!!!!!!

Вот что я получаю на диаграмме: Диаграмма объекта

Собственно, вопрос: как сделать так, чтобы субрегион не добавлялся в коллекцию регионов страны?

1 Ответ

1 голос
/ 05 марта 2019

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

Чтобы решить эту проблему, вы должны либоудалить свойство Country из Region.Или вы создаете два класса Region и SubRegion, где Region имеет свойство Country (возможно, также нет свойства SuperiorRegion, если иерархия не может идти глубже двух уровней).И SubRegion не имеет Country свойства.

...