我有一个实体框架模型:
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
表中添加了一个新实例,该实例具有现有的Application
:但是当我试图显示这个
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以引入相关的
ApplicationPayment
s。然后需要使用SingleOrDefault
而不是Find
,因为Find
不适用于Include
。(Find
在命中数据库之前,首先在上下文中查找对象,因此无法解释可用的相关项。)