C# ASP.NET Core DB First scaffolding Join不';行不通
我已经创建了一个测试ASP.NET核心项目。我已经使用Scaffold DbContext命令从现有数据库生成了模型 一切都很顺利。我已经添加了一个ApiController来返回数据,如果我使用LINQ查询简单的平面表数据,或者我在DB中显式定义了外键的表上进行连接,那么它就会工作 但是,如果我将未设置外键的两个表连接起来,则不会返回任何内容 请注意,这两个表通过整数ID(MktId)相互关联 脚手架生成的实体模型:C# ASP.NET Core DB First scaffolding Join不';行不通,c#,asp.net-core,entity-framework-core,C#,Asp.net Core,Entity Framework Core,我已经创建了一个测试ASP.NET核心项目。我已经使用Scaffold DbContext命令从现有数据库生成了模型 一切都很顺利。我已经添加了一个ApiController来返回数据,如果我使用LINQ查询简单的平面表数据,或者我在DB中显式定义了外键的表上进行连接,那么它就会工作 但是,如果我将未设置外键的两个表连接起来,则不会返回任何内容 请注意,这两个表通过整数ID(MktId)相互关联 脚手架生成的实体模型: public partial class MonthlyPrice {
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 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);
});
modelBuilder.Entity(Entity=>
{
entity.HasKey(e=>e.MktId);
实体。可转帐(“市场”);
entity.Property(e=>e.MktId).HasColumnName(“mkt_id”);
Property(e=>e.MktName)
.IsRequired()
.HasColumnName(“市场名称”)
.HasMaxLength(250);
});
关于为商品表生成的表,我注意到有一行entity.ToTable(“\uuu Markets”)那对我来说很奇怪
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 –IgnoreChanges
我想最棒的是,你有一个黄金机会让它比上一个人做得更好。开始时,所有内容都相同(表名、列名、键等)。消除所有的差异
当前表名和主键名明显不同。看起来数据库中未配置(至少正确配置)月费
和市场之间的一对多关系。此外,Commodity
和Market
是否应该与MonthlyPrice
作为中间表有多对多关系?@David Liang但如果用于连接的ID的编号匹配,为什么它不返回任何内容??有时,即使存在外键,也不会在数据库中配置它们。对于EF6,我从来没有遇到过这个问题。如果这个数据库是预先存在的,您可能希望使用命令行对您的上下文进行反向工程。这样,它将有望获得有效的起点。请记住,潜在的变化是EF Core,而不是与前辈一对一,也就是说,如果它在EF6中起作用,那么它应该在Core中起作用。并非总是如此。@mvermef scaffold dbcontext是从数据库创建模型的命令。所以,你告诉我,这是不可能的,我所面临的,数据中肯定有错误?不,我是说,你的配置可能与数据库的配置不匹配,这并不意味着你不能得到正确的配置,你只需要多研究一点,以便在你的代码中正确配置一对一。它可能只需要在代码级别进行调整。我只是建议反向脚手架可能会带来这种关系,这不是db的第一种方法。Vil Space会毁掉一切。包括数据库迁移。
Add-Migration awesome
Update-Database awesome
Add-Migration awesome –IgnoreChanges