首页 新闻 搜索 专区 学院

Entity Framework中对象的更新

0
悬赏园豆:20 [已解决问题] 解决于 2013-08-17 11:06

在使用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);
wangzhw的主页 wangzhw | 初学一级 | 园豆:141
提问于:2013-08-16 11:24
< >
分享
最佳答案
0

先 SaveChanges 后,再访问 Category 属性。

收获园豆:20
Launcher | 高人七级 |园豆:45045 | 2013-08-16 11:28

已经SaveChanges过了,不然Id也取不到啊。

wangzhw | 园豆:141 (初学一级) | 2013-08-16 11:40

@披靡小草: 如果从 DbContext 中选择出的 Blog,其 Category 是按照延迟规则加载的吗?

Launcher | 园豆:45045 (高人七级) | 2013-08-16 11:46

@Launcher: Db中Blog和Category两个表是有外键关系的,Model是从数据库更新的。

wangzhw | 园豆:141 (初学一级) | 2013-08-16 11:53

@披靡小草: SaveChanges之后,访问Category属性得到的结果是什么?

dudu | 园豆:38804 (高人七级) | 2013-08-16 11:53

@dudu: null

wangzhw | 园豆:141 (初学一级) | 2013-08-16 12:04

@dudu: 创建完毕后,不直接使用创建的对象,拿ID再去一次(*1)也是一样,但是跳转到Blog的详细页面(*2)取得的对象就是正常的,包含Category的信息。

PS:*1和*2调用的是同一个方法,传递的值是Blog的Id。

wangzhw | 园豆:141 (初学一级) | 2013-08-16 12:07

@披靡小草: 参看下面的代码,测试下 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 | 园豆:45045 (高人七级) | 2013-08-16 13:04

@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 }
wangzhw | 园豆:141 (初学一级) | 2013-08-16 15:00

@披靡小草: 

BlogRepository blogRepository = new BlogRepository();

var blog = new Blog{Name="ADO.NET Blog"};

    blogRepository.Add(blog);

   blogRepository.SaveChanges();

    var category = blog.Category;

测试下,Category 有值吗?

Launcher | 园豆:45045 (高人七级) | 2013-08-16 15:11

@Launcher: 没有值的 --||

wangzhw | 园豆:141 (初学一级) | 2013-08-16 16:01
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册