ASP.NET Core DB Первые строительные леса Присоединение не работает - PullRequest
1 голос
/ 08 марта 2019

Я создал тестовый проект ASP.NET Core. Я сгенерировал модели из существующей БД с помощью команды Scaffold-DbContext.

Все прошло хорошо. Я добавил ApiController для возврата данных, и если я запрашиваю, используя LINQ, простые данные плоских таблиц или делаю соединения в таблицах, где внешние ключи были явно определены в БД, это работает.

Но если я сделаю запрос, соединяющий две таблицы , где внешние ключи не установлены, он ничего не вернет .

Обратите внимание, что две таблицы связаны друг с другом целочисленным ID ( MktId ).

Модели сущностей, сгенерированные скаффолдом:

public partial class MonthlyPrice
{
    public int MpId { get; set; }        
    public int MktId { get; set; }
    public int CmId { get; set; }
    public decimal MpPrice { get; set; }

    public Commodities Cm { get; set; }
    public Currencies Cur { get; set; }
    public PriceTypes Pt { get; set; }
    public UnitOfMeasure Um { get; set; }
}

public partial class Commodities
{
    public Commodities()
    {
        MonthlyPriceItem = new HashSet<MonthlyPriceItem>();
    }

    public int CmId { get; set; }
    public string CmName { get; set; }
    public int CmCatId { get; set; }

    public ICollection<MonthlyPrice> MonthlyPriceItem { get; set; }
}

public partial class Markets
{
    public int MktId { get; set; }
    public string MktName { get; set; }
}

следующий запрос возвращает результаты:

var price= (from m in db.MonthlyPrice
           join c in db.Commodities on m.CmId equals c.CmId
           select new
           {
               c.CmName,
               m.MpPrice
           });

но этот ничего не возвращает:

var price= (from m in db.MonthlyPrice
           join mk in db.Markets on m.MktId equals mk.MktId
           select new
           {
               m.MpPrice,
               mk.MktName
           });

Обратите внимание, что оба запроса на Entity Framework 6.x на ASP.NET 4.7 отлично работают .

Нужно ли указывать весь внешний ключ в БД для корректной работы EFCore?

(Db не всегда спроектирован мной !!)

UPDATE

Конструктор моделей для Markets был сгенерирован командой scaffold-dbcontext следующим образом:

modelBuilder.Entity<Markets1>(entity =>
{
    entity.HasKey(e => e.MktId);

    entity.ToTable("__Markets");

    entity.Property(e => e.MktId).HasColumnName("mkt_id");

    entity.Property(e => e.MktName)
        .IsRequired()
        .HasColumnName("mkt_name")
        .HasMaxLength(250);    
});

По отношению к сгенерированной для Commodities таблице. Я заметил, что есть строка entity.ToTable ("__ Markets"); , которая выглядит для меня очень странно.

1 Ответ

0 голосов
/ 10 марта 2019
  1. Если вы хотите немного с этим бороться:

Обновите хотя бы до .NET Core 2.1

Сохраните исходные имена баз данных, чтобы удалить фанк вмиграция.Используйте параметр -UseDatabaseNames.

scaffold-dbcontext  -UseDatabaseNames 
Иначе, продолжить:

Аннотации могут быть полезны в любом случае, если ваши идентификаторы или имена таблиц в текущей базе данных фанки (пробелы, префиксы и т. Д.)

Добавьте Markets в класс MonthlyPrice в качестве внешнего ключа.Сделайте идентификаторы очевидными для миграции, используя аннотации данных.

[Table(“MonthlyPrice”)]
public partial class MonthlyPrice
{
    [Key]
    public int MpId { get; set; }        

    [ForeignKey("Markets")]
    public int MktId { get; set; }
    public Markets Mkt { get; set; }

    [ForeignKey("Commodities")]
    public int CmId { get; set; }
    public Commodities Cm { get; set; }

    public decimal MpPrice { get; set; }
    public Currencies Cur { get; set; }
    public PriceTypes Pt { get; set; }
    public UnitOfMeasure Um { get; set; }
}
[Table(“Commodities”)]
public partial class Commodities
{
    public Commodities()
    {
        MonthlyPriceItem = new HashSet<MonthlyPriceItem>();
    }

    [Key]
    public int CmId { get; set; }
    public string CmName { get; set; }
    public int CmCatId { get; set; }

    public ICollection<MonthlyPrice> MonthlyPriceItem { get; set; }
}

[Table(“Markets”)]
public partial class Markets
{
    [Key]
    public int MktId { get; set; }
    public string MktName { get; set; }
}

При воссоздании базы данных:

Add-Migration awesome

Update-Database awesome

Иначе, если просто добавить миграцию:

Add-Migration awesome –IgnoreChanges

Думаю, самое замечательное, у вас есть прекрасная возможность сделать это лучше, чем у последнего парня.Начиная с Same-Same на всем (имена таблиц, имена столбцов, ключи, было бы неплохо).Устраните все различия.

В настоящее время существуют явные различия как в именах таблиц, так и в именах первичных ключей.

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