我遇到了EF6延迟加载的问题.我搜索过StackOverflow,但我发现的其他问题并不适合我的情况.
我正在使用虚拟关键字,我的课程是公开的. LazyLoadingEnabled和ProxyCreationEnabled都设置为true.
当我从db加载一个course对象时,presentationId被设置为正确的id,而presentation是null,这是正确的,因为它还没有被加载.
当我将presentation属性传递给PresentationsController.ToDto()方法时,它应该是延迟加载的,但是我在方法中得到一个空引用异常,因为它仍然是null.
我知道关系正在起作用,因为当我在Watch窗口中强制加载课程的presentation属性时,在公共静态CourseDto ToDto(课程项,DnbContext db)方法中加载了一个断点.看图像:
如您所见,item.presentation为null:
当我手动评估引用与项目对象相同的表示的db.courses.Find(257).presentation时,它们都被加载:
这是我的POCO:
public abstract class BaseModel : ISoftDelete {
public int id { get; set; }
}
public class Course : BaseModel {
[Required]
public int presentationId { get; set; }
public virtual Presentation presentation { get; set; }
}
我的Web API控制器方法:
// GET api/Courses/5
public CourseDto GetCourse(int id) {
var item = db.courses.FirstOrDefault(x => x.id == id);
return ToDto(item, db);
}
public static CourseDto ToDto(Course item, DnbContext db) {
var dto = new CourseDto();
if (item.presentationId > 0) dto.presentation = PresentationsController.ToDto(item.presentation, db);
return dto;
}
有任何想法吗?
解决方法:
如果要通过动态代理使用延迟加载,则实体必须已显式声明公共构造函数. (如果你有其他参数)
public abstract class BaseModel : ISoftDelete {
public BaseModel() { }
public int id { get; set; }
}
public class Course : BaseModel {
public Course() { }
[Required]
public int presentationId { get; set; }
public virtual Presentation presentation { get; set; }
}
标签:c,entity-framework-6 来源: https://codeday.me/bug/20190612/1226130.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。