【问题标题】:How to gain access to table data through foreign key reference?如何通过外键引用访问表数据?
【发布时间】:2016-03-29 12:24:27
【问题描述】:

我的一个实体中有一个语句,它使用外键返回 IEnumberable<CustomField>

我在我的存储库中使用了 LINQ 来测试下面的方法,看看它是否有效。但是当我在实体中使用外键引用时,它返回 null。我在这里错过了什么吗?如何使用外键访问另一个实体中的数据。

Invoice Entity:
 [Table("vwinvoice")]
    public class Invoice {
        [Key]
        [DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]
        public int Sys_InvoiceID { get; set; }
        [DisplayName("Inc.In Turnover")]
        public bool Turnover { get; set; }
        public int FK_StatusID { get; set; }
        [DisplayName("Invoice No.")]
        public string InvoiceNumber { get; set; }
        [DisplayName("Invoice Date")]
        public DateTime InvoiceDate { get; set; }
        [DisplayName("Document Type")]
        public string DocType { get; set; }
        [DisplayName("Supplier Invoice No.")]
        [Column("SupplierInvoiceNumber")]
        public string SuppInvNumber { get; set; }
        public int FK_SupplierID { get; set; }
        [DisplayName("Account Number")]
        public string AccountNumber { get; set; }
        [DisplayName("Order Number")]
        public string OrderNumber { get; set; }
        [DisplayName("Order Date")]
        public DateTime? OrderDate { get; set; }
        [DisplayName("Currency Code_Doc")]
        public string CurrencyCode_Doc { get; set; }
        [DisplayName("Net Amount_Doc")]
        public decimal? NetAmount_Doc { get; set; }
        [DisplayName("VAT Amount_Doc")]
        public decimal? VATAmount_Doc { get; set; }
        [DisplayName("Gross Amount_Doc")]
        [Required]
        public decimal? GrossAmount_Doc { get; set; }
        [DisplayName("Currency Code_Home")]
        public string CurrencyCode_Home { get; set; }
        [DisplayName("Net Amount_Home")]
        public decimal? NetAmount_Home { get; set; }
        [DisplayName("VAT Amount_Home")]
        public decimal? VATAmount_Home { get; set; }
        [DisplayName("Gross Amount_Home")]
        public decimal? GrossAmount_Home { get; set; }
        [DisplayName("Payment Reference")]
        public string PaymentReference { get; set; }
        [DisplayName("Supplier")]
        public string AccountName { get; set; }
        [DisplayName("Status")]
        public string StatusName { get; set; }
        [DisplayName("Auditor Comments")]
        public string AuditorComments { get; set; }
        [DisplayName("Reviewer Comments")]
        public string ReviewerComments { get; set; }
        [DisplayName("Data Source")]
        [Required]
        public string DataOrigin { get; set; }
        public int DetailLineCount { get; set; }

        public IEnumerable<CustomField> ClientData {
            get {
//Use the CustomFields foreign key to gain access to the data returns null.
                return GetCustomFieldData(this.CustomFields.Select(r => r));
            }
        }

        private IEnumerable<CustomField> GetCustomFieldData(IEnumerable<Entities.CustomFields> enumerable) {
            return (from f in enumerable
                    select new CustomField {
                        Name = f.FK_CustomHeader,
                        Value = f.Value
                    });
        }

        //Custom Field Additions
        public virtual ICollection<CustomFields> CustomFields { get; set; }
    }

自定义字段实体:

[Table("tblCustomFields")]
    public class CustomFields {
        [Key]
        public int ID { get; set; }

        public int? FK_SysInvoiceID { get; set; }

        [StringLength(255)]
        public string FK_CustomHeader { get; set; }

        [StringLength(255)]
        public string Value { get; set; }

        public virtual Invoice Invoices { get; set; }

        public virtual CustomFieldHeaders CustomFieldHeaders { get; set; }
    }

我也无法在 get 语句中放置断点来查看会发生什么,这是为什么呢?每当我尝试返回发票列表时,它都会跳过断点,可以在这里看到:

 public IQueryable<Invoice> Invoices {
            get {
                var x = _ctx.Invoices.ToList();
                return _ctx.Invoices;
            }
        }

【问题讨论】:

  • 使用 Join 语句将两个类结合起来怎么样?
  • 是的,我可以。只是宁愿使用我的 FK

标签: c# mysql entity-framework linq


【解决方案1】:

您在声明 CustomFields 属性时使用了 virtual 关键字。因此,它将被延迟加载。如果您希望在从存储库返回后填充该属性,您需要在您的方法中显式地 Include 表:

var x = _ctx.Invoices.Include(i => i.CustomFields).ToList();
return _ctx.Invoices;

或者您可以删除 virtual 关键字,并且该属性将始终被填充,随之而来的是数据库连接的性能损失以及每当您访问 Invoices 时返回的额外数据。

【讨论】:

  • 您好,感谢您的回答。你是对的,但是当使用 lambda 表达式时,它什么也不返回。相反,我必须这样做: var x = _ctx.Invoices.Include("CustomFields").ToList();
  • 您使用的是什么版本的 EF? lambda 代码是否编译?看起来很奇怪,因为工作字符串路径是 lambda 的直接等价物,因为两者都引用了一个对象一次。
  • EF6 for MySQL 并且可以编译。
  • 您是否在上下文中明确声明了外键?即modelBuilder.Entity&lt;Invoices&gt;().HasMany(e =&gt; e.CustomFields).WithOptional(e =&gt; e.Invoices)
  • 或者给定你的外键列名:modelBuilder.Entity&lt;Invoices&gt;().HasMany(e =&gt; e.CustomFields).WithOptional(e =&gt; e.Invoices).HasForeignKey(e =&gt; e.FK_SysInvoiceID)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-10
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多