如何使用EF Core加载导航属性?

时间:2016-10-16 00:05:00

标签: entity-framework entity-framework-core

在EF6中我们有这样的选择:

context.Set<TEntity>().Attach(entity);
context.Entry(entity).Collection("NavigationProperty").Load();

由于EF Core“100%严格打字”,他们已经删除了Collection功能。但应该用什么呢?

添加了: 我的意思是如何为ATTACHED实体加载包含/“导航集合属性”?

3 个答案:

答案 0 :(得分:8)

你有两种方法。

<强> 1。渴望加载

e.g。

var blogs = context.Blogs
    .Include(blog => blog.Posts)
    .ToList();

<强> 2。明确加载

e.g。

var blog = context.Blogs
    .Single(b => b.BlogId == 1);

context.Posts
    .Where(p => p.BlogId == blog.BlogId)
    .Load();

您可以在此处详细了解:Loading Related Data

更新:

您可以对该用例使用 TrackGraph API 。这是链接:graph behavior of Add/Attach

另一个链接:DbSet.Add/Attach and graph behavior

答案 1 :(得分:3)

在Entity Framework Core v1.1中添加了显式加载。 见Microsoft Docs

来自文档:

using (var context = new BloggingContext())
{
    var blog = context.Blogs
    .Single(b => b.BlogId == 1);

    context.Entry(blog)
        .Collection(b => b.Posts)
        .Load();

    context.Entry(blog)
        .Reference(b => b.Owner)
        .Load();
}

答案 2 :(得分:1)

见下面的代码,
我在UserRef表中插入数据以及另外一个表,我们有很多关系。

public void AddUser(User user, IEnumerable<UserSecurityQuestion> securityQuestion, string password)
    {
        var userModel = _mapper.Map<User, UserRef>(user);
        userModel.CreateTime = DateTime.Now;

        userModel.UserNewsLetterMaps.ToList().ForEach(u => this._context.UserNewsLetterMaps.Add(u));            
        this._context.RoleRefs.Attach(new RoleRef() { RoleId = (int)user.UserRole, UserRefs = new List<UserRef> { userModel } });
        userModel.ResidenceStatusRefs.ToList().ForEach(u => this._context.ResidenceStatusRefs.Attach(u));
        this._context.UserRefs.Add(userModel);
        this.Save();
    }