ASP.NET Core DB First脚手架连接不起作用

时间:2019-03-08 20:59:15

标签: c# asp.net-core entity-framework-core

我已经创建了一个测试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”); 对我来说很奇怪。

1 个答案:

答案 0 :(得分:0)

  1. 如果您想与之抗争:

至少更新到.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) );
  1. 否则,继续:

如果您的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

我想最棒的是,您有千载难逢的机会使它比上一个家伙更好。从所有内容(表名,列名,键等)开始都是相同的。清理所有差异。

您的表名和主键名当前明显不同。