我有一个实体框架模型:

public class Application
{
    [Key]
    public int ApplicationID { get; set; }
    public int PatentID { get; set; }

    ...

    //------------------------------------
    public string ApplicationNumber { get; set; }
    public string Priority { get; set; }
    public List<ApplicationPayment> Payments { get; set; }
                          = new List<ApplicationPayment>();
}

支付模式:
public class ApplicationPayment
{
    [Key]
    public int PaymentID { get; set; }
    public string PaymentName { get; set; }
    public float Amount { get; set; }
    public int PayNumber { get; set; }
    public DateTime Date { get; set; } = new DateTime(2017, 12, 1);
    public float TopicPart { get; set; }
}

实体框架在ApplicationPayment模型Application_ApplicationID中为我创建其他外键。
我在ApplicationPayment表中添加了一个新实例,该实例具有现有的Applicationc# -  Entity Framework 模型中的更新列表-LMLPHP
但是当我试图显示这个ApplicationPayment的表时,它返回空表。
我试图通过sqlservermanagementstudio和假请求手动添加ApplicationPayment。已添加新行,但applicationpayment列表仍然为空。
假请求:
    [HttpPut]
    public void CreateApplicationPayment(int? id)
    {
        ApplicationPayment appPayment = new ApplicationPayment()
        {
            Amount = 80.0f,
            Date = new DateTime(2017, 10, 25),
            PaymentName = "payment",
            PayNumber = 30,
            TopicPart = 20
        };

        Application application = db.Applications.Find(id);

        application.Payments.Add(appPayment);
        db.SaveChanges();

    }

最佳答案

如果希望EF自动填充集合属性,则集合属性必须是虚拟的:

public virtual List<ApplicationPayment> Payments { get; set; }

另外,如果您使用的是ef 6或previous,则需要将该属性的类型设置为ICollection<ApplicationPayment>,而不是List<ApplicationPayment>。我认为ef core放宽了这个限制,但我不确定。所以,如果你仍然有问题,也可以在那里改变。
然而,这就是所谓的延迟加载,在大多数情况下并不理想。另外,如果您使用ef core,它仍然无法工作,因为当前ef core不支持延迟加载。更好的方法是急切地加载关系。这是通过在linq查询中使用Include完成的:
Application application = db.Applications.Include(m => m.ApplicationPayments).SingleOrDefault(m => m.Id == id);

这将导致ef执行join以引入相关的ApplicationPayments。然后需要使用SingleOrDefault而不是Find,因为Find不适用于Include。(Find在命中数据库之前,首先在上下文中查找对象,因此无法解释可用的相关项。)

08-19 17:22