![](/img/trans.png)
[英]Using command line how to do scaffolding from DB first in ASP.NET - not ASP.NET Core MVC?
[英]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”); 這對我來說很奇怪。
至少更新到.NET Core 2.1
保留原始數據庫名稱以刪除遷移中的功能。 使用-UseDatabaseNames選項。
scaffold-dbcontext -UseDatabaseNames
如果您的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.