Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET Core DB First scaffolding Join不';行不通_C#_Asp.net Core_Entity Framework Core - Fatal编程技术网

C# ASP.NET Core DB First scaffolding Join不';行不通

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 {

我已经创建了一个测试ASP.NET核心项目。我已经使用Scaffold DbContext命令从现有数据库生成了模型

一切都很顺利。我已经添加了一个ApiController来返回数据,如果我使用LINQ查询简单的平面表数据,或者我在DB中显式定义了外键的表上进行连接,那么它就会工作

但是,如果我将未设置外键的两个表连接起来,则不会返回任何内容

请注意,这两个表通过整数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 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”)
  • 如果你想和它斗争一点:
  • 至少更新到.NET Core 2.1

    保留原始数据库名称以删除迁移中的funk。使用-UseDatabaseNames选项

    scaffold-dbcontext  -UseDatabaseNames 
    
  • 否则,请继续:
  • 如果当前数据库上的ID或表名很时髦(空格、前缀等),则注释可能很有价值

    将Markets作为外键添加到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 –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