更新和编辑多个表Entity Framework

时间:2015-03-14 13:06:43

标签: c# asp.net sql-server entity-framework

我有四个表(Locations,Events,MainTags,EventTags),在Events表和其他三个表中的每一个表之间是多对多关系。

现在我想在同一页面上编辑和显示这些表格中的数据,但我不确定这样做的正确方法。

现在我这样做就是从Events表中的每个条目中获取id,然后在每个其他表中搜索相同的id,将这些结果保存在列表中稍后在页面上显示它。 (adc是我与数据库的连接)

List<Event> allEvents = adc.Events.ToList();
List<Location> testTHis = new List<Location>();

foreach (Event eve1 in allEvents)
{
   var query_test = from a in adc.Locations where a.Id ==  eve1.id select a;
   testTHis = query_test.ToList();
}

但这似乎是一项相当繁琐的工作而且看起来并不好看,所以我想知道是否有更好的方法可以做到这一点,特别是后来当数据库中有大量数据时这似乎不是一个好主意,因为它需要花费很多时间才能完成。任何人都可以帮我找出更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

您的Event实体应该公开3个导航属性:

public virtual ICollection<Location> Locations { get; set; }
public virtual ICollection<MainTag> MainTags { get; set; }
public virtual ICollection<EventTag> EventTags { get; set; }

然后,当您查询事件时,告诉EF包含所有标记/事件标记和位置。

context.Events
       .Include(x => x.Locations)
       .Include(x => x.MainTags)
       .Include(x => x.EventTags)
       .ToList()

这将在一个查询中一起检索事件及其Locations,MainTags和EventTags。

包含的一个警告词是,每个事件都有自己的标记/位置,即使它被多次引用。

E.g。假设你有2个事件,

  1. CodePerfDotNetEvent {Tag = {ID = 1,Name =“Blog”}}
  2. MichalCiechanEvent {Tag = {ID = 1,Name =“Blog”}}
  3. 当您使用include时,即使它们代表数据库中的相同值,您也会获得 2 个不同的Tag个对象。

    否则,您将启用LazyLoading和ProxyGeneration,并且每次访问其中一个Locations / EventTags / MainTags虚拟属性时,EF都会对数据库进行多次调用。