gpt4 book ai didi

database - Entity Framework 4.3.1 Code First 关系在获取数据时不起作用

转载 作者:搜寻专家 更新时间:2023-10-30 20:20:08 24 4
gpt4 key购买 nike

这是我第一次使用 Entity Framework 4.3.1 在 C# 中创建项目。我在从 Tournament 表中获取所有数据时遇到了麻烦,准确地说是地址。

首先,这是我的 Code First 代码。当我运行它时,这 2 个表是用正确的关系正确创建的。我在这些类中定义了更多的列,但对于这个例子我只显示了几个。

public class EFDbContext : DbContext
{
public EFDbContext()
: base("ApplicationServices")
{
}

public DbSet<Tournament> tournaments { get; set; }
public DbSet<Address> addresses { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}

public class Tournament
{
[ScaffoldColumn(false)]
public int TournamentId { get; set; }


[Required(ErrorMessage="Tournament name is a required field")]
public string Name { get; set; }


[Required(ErrorMessage="Address is a required field")]
public Address Address { get; set; }
}

public class Address
{
[ScaffoldColumn(false)]
public int AddressId { get; set; }


[Required(ErrorMessage="Street name is a required field")]
public string Street { get; set; }


[Required(ErrorMessage="House number is a required field")]
public string HouseNo { get; set; }
}
}

当我插入一个带有地址的新锦标赛时,我去检查数据库是否使用了该关系,我可以看到它有效。锦标赛有一个指向新插入地址的 Address_AddressId 值。但是当我尝试通过这样做获取信息时:

Tournament tournament = context.tournaments.Find(id);

然后我调试它,我可以看到锦标赛的所有数据都在锦标赛对象中,地址除外。这设置为 null,我完全不知道为什么。

你们能帮帮我吗?

提前致谢,巴特

最佳答案

您需要稍微熟悉一下如何使用 Entity Framework 加载相关数据。介绍在这里:http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities.aspx这些是您需要了解的基础知识,才能有效地使用 Entity Framework。

您看到的行为是预期的。 Entity Framework 不会加载导航属性 - 如 Tournament.Address - 当你加载父实体 Tournament 时自动加载(在你的 Find示例)。

加载相关数据基本上有三个选项:

  • 预加载:

    Tournament tournament = context.tournaments
    .Include(t => t.Address) // <- "eager loading"
    .SingleOrDefault(t => t.TournamentId == id);

    我们将在单个往返和数据库查询中加载比赛和地址。

  • 延迟加载:将您的导航属性标记为虚拟:

    public virtual Address Address { get; set; }

    当您加载锦标赛时,EF 将动态创建一个代理对象(派生自 Tournament),只要您访问其属性之一,它就能够加载相关实体:

    Tournament tournament = context.tournaments.Find(id);
    string street = tournament.Address.Street; // second query to DB happens here
  • 显式加载:

    Tournament tournament = context.tournaments.Find(id);
    context.Entry(tournament).Reference(t => t.Address).Load();
    // second query to DB happens here

    这类似于延迟加载,因为您还需要两次查询和往返数据库,但您可以显式控制何时加载 Address。显式加载可以选择过滤或排序相关数据(在导航集合的情况下),这是其他两个选项所没有的。

关于database - Entity Framework 4.3.1 Code First 关系在获取数据时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10367201/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com