簡體   English   中英

ASP.NET Core DB First腳手架連接不起作用

[英]ASP.NET Core DB First scaffolding Join doesn't work

我已經創建了一個測試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
           });

請注意, 在ASP.NET 4.7上的Entity Framework 6.x上的兩個查詢都可以正常運行

我是否必須在數據庫中指定所有外鍵才能使EFCore正常工作?

(DB並非總是由我設計!!)

更新

市場的模型構建器是通過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表生成的那個,我注意到有一行object.ToTable(“ __ Markets”); 這對我來說很奇怪。

  1. 如果您想與之抗爭:

至少更新到.NET Core 2.1

保留原始數據庫名稱以刪除遷移中的功能。 使用-UseDatabaseNames選項。

scaffold-dbcontext  -UseDatabaseNames 
  1. 否則,繼續:

如果您的ID或當前數據庫上的表名很時髦(空間,前綴等),則注釋可能很有價值。

將市場添加到MonthlyPrice類作為外鍵。 使用數據注釋使ID對遷移顯而易見。

[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

我想最棒的是,您有了千載難逢的機會使它比上一個家伙更好。 從所有內容(表名,列名,鍵等)開始都是相同的。 清理所有差異。

當前,表名和主鍵名顯然存在差異。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM