在使用Entity Framework中遇到如下问题:创建对象后,因为对象有延迟加载的字段,现在取不到这些字段?该怎么从数据库把这些信息更新出来呢?比如,
class Blog {
public int Id { get; set; }
public string Content { get; set; }
public virtual ICollection<Category> Category { get; set; }
}
创建了一个Blog对象后,Id可以获取到,但是Category取不到。
请指教。
已解决:
先把对象Detach掉,然后再重新获取。
((IObjectContextAdapter)DbContext).ObjectContext.Detach(entity);
先 SaveChanges 后,再访问 Category 属性。
已经SaveChanges过了,不然Id也取不到啊。
@披靡小草: 如果从 DbContext 中选择出的 Blog,其 Category 是按照延迟规则加载的吗?
@Launcher: Db中Blog和Category两个表是有外键关系的,Model是从数据库更新的。
@披靡小草: SaveChanges之后,访问Category属性得到的结果是什么?
@dudu: null
@dudu: 创建完毕后,不直接使用创建的对象,拿ID再去一次(*1)也是一样,但是跳转到Blog的详细页面(*2)取得的对象就是正常的,包含Category的信息。
PS:*1和*2调用的是同一个方法,传递的值是Blog的Id。
@披靡小草: 参看下面的代码,测试下 Category 是否有值。
using(DbContext ctx = new DbContext)
{
var blog = new Blog{Name="ADO.NET Blog"};
ctx.Blogs.Add(blog);
ctx.SaveChanges();
var category = blog.Category;
}
@Launcher: 这跟我写的应该是没多大分别的,请赐教。
1 // 执行保存 2 result = this._blogRepository.SaveBlog(blog); 3 this._blogRepository.SaveChanges(); 4 5 public class BlogRepository : GenericRepository, IBlogRepository 6 { 7 public bool SaveBlog(Blog blog) 8 { 9 if (blog.Id == default(long)) 10 { 11 this.Add(blog); 12 } 13 else 14 { 15 this.Update(blog); 16 } 17 18 return true; 19 } 20 } 21 22 public class GenericRepository : IRepository 23 { 24 public void Add<TEntity>(TEntity entity) where TEntity : class 25 { 26 if (entity == null) 27 { 28 throw new ArgumentNullException("entity"); 29 } 30 31 DbContext.Set<TEntity>().Add(entity); 32 } 33 34 public void Update<TEntity>(TEntity entity) where TEntity : class 35 { 36 var fqen = GetEntityName<TEntity>(); 37 38 object originalItem; 39 EntityKey key = ((IObjectContextAdapter)DbContext).ObjectContext.CreateEntityKey(fqen, entity); 40 if (((IObjectContextAdapter)DbContext).ObjectContext.TryGetObjectByKey(key, out originalItem)) 41 { 42 ((IObjectContextAdapter)DbContext).ObjectContext.ApplyCurrentValues(key.EntitySetName, entity); 43 } 44 } 45 46 47 public TEntity Save<TEntity>(TEntity entity) where TEntity : class 48 { 49 Add<TEntity>(entity); 50 DbContext.SaveChanges(); 51 return entity; 52 } 53 54 public void SaveChanges() 55 { 56 this.DbContext.SaveChanges(); 57 } 58 }
@披靡小草:
BlogRepository blogRepository = new BlogRepository();
var blog = new Blog{Name="ADO.NET Blog"};
blogRepository.Add(blog);
blogRepository.SaveChanges();
var category = blog.Category;
测试下,Category 有值吗?
@Launcher: 没有值的 --||