创建一个方法来传递导航器并在该方法中重新加载导航器

时间:2013-08-25 08:00:23

标签: entity-framework ef-code-first predicate

在我发现首先在EF代码中插入操作后没有填充导航属性后,我决定创建一个方法来重新加载导航。让我们认为我们有两个类:

public class Book
{
    public int Id {get ; set;}
    public string Title {get ; set;}
    public virtual ICollection<Page> Pages {get ; set;}
}

public class Page
{
    public int Id {get ; set;}
    public string Content {get ; set;}
    public int BookId {get ; set;}
    public virtual Book Book {get ; set;}
}

并在以下代码中我有:

DbContext db = new DbContext()

Page p = new Page();
p.BookId = 1;
p.Content = "Sample Content";

db.Pages.Add(p);

db.SaveChanges();
db.Reload(p, rec => rec.Book); // Here is the wanted method

我试过这个,但我失败了

public class DbContext : DbContext
{
    ///I know this method is wrong, I have no idea to fix it
    public T Reload<T>(T Obj, param Func<T,I_DONT_KNOW_WHAT_I_SHOULD_PUT_HERE>[] predicates )
    {
        foreach(var item in predicates)
        {
             this.Entry<T>(Obj).Reference(item).Load();
        }
    }
}

有没有人帮我完成这个方法?

2 个答案:

答案 0 :(得分:0)

我要注意我确实遵循你要做的事情。 但我的第一个是推荐

基本的重新加载表格是:

Context.Entry<TPoco>(poco).Reload();

您也可以使用包含表单

var Qpocolist = Context.Set<TPoco>().Include(t=>t.Navprop).Where(t => t.Navprop.xyz=="xyz");

但也许它只是传递了一个你想要提示的道具表达式数组。 您需要将该方法声明为Poco和Property的通用。

public void MyFancySetNavs<TPoco, TProp>(TPoco obj, params  Expression<Func<TPoco, TProp>>[] navProps) {
        foreach (var navPropExp in navProps) {
            // do ya thing...
        }

    }

答案 1 :(得分:0)

我将代码更改为此,因此导航器正确填充。所以我不需要这样提到的方法

DbContext db = new DbContext()

Page p = db.Pages.Create();
p.BookId = 1;
p.Content = "Sample Content";

db.Pages.Add(p);

db.SaveChanges();
db.Reload(p, rec => rec.Book);