我已经创建了一个测试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);
});
相对于为商品表生成的那一行,我注意到有一行 entity.ToTable(“ __ Markets”); 对我来说很奇怪。
答案 0 :(得分:0)
至少更新到.NET Core 2.1
保留原始数据库名称以删除迁移中的功能。使用-UseDatabaseNames选项。
// get an image blob from url using fetch
let getImageBlob = function(url){
return new Promise( async resolve=>{
let resposne = await fetch( url );
let blob = resposne.blob();
resolve( blob );
});
};
// convert a blob to base64
let blobToBase64 = function(blob) {
return new Promise( resolve=>{
let reader = new FileReader();
reader.onload = function() {
let dataUrl = reader.result;
resolve(dataUrl);
};
reader.readAsDataURL(blob);
});
}
// combine the previous two functions to return a base64 encode image from url
let getBase64Image = async function( url ){
let blob = await getImageBlob( url );
let base64 = await blobToBase64( blob );
return base64;
}
// test time!
getBase64Image( 'http://placekitten.com/g/200/300' ).then( base64Image=> console.log( base64Image) );
如果您的ID或当前数据库上的表名很时髦(空格,前缀等),则注释可能会很有价值
将市场添加到MonthlyPrice类作为外键。使用数据注释使ID对迁移显而易见。
scaffold-dbcontext -UseDatabaseNames
如果重新创建数据库:
[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
我想最棒的是,您有千载难逢的机会使它比上一个家伙更好。从所有内容(表名,列名,键等)开始都是相同的。清理所有差异。
您的表名和主键名当前明显不同。