【问题标题】:Projecting a 1:n relationship to a single entity in Entity Framework 6.1.3在 Entity Framework 6.1.3 中将 1:n 关系投影到单个实体
【发布时间】:2017-04-19 22:34:41
【问题描述】:

我是 Entity Framework 的新手,所以请多多包涵。 ;)

我首先在 C# 桌面应用程序中使用 Entity Framework 6.1.3 代码。

假设我在 SQL Server 2008 中有以下两个表:

日历周

  • id (long)
  • 年(int
  • 周数(tinyint
  • 描述(文本

日历事件

  • id (long)
  • calendarweek_id(long,外键)
  • 标题(varchar

在应用程序中,我有一个这样的 POCO:

class Event
{
    public long Id { get; set; }
    public int Year { get; set; }
    public Byte Week { get; set; }
    public String Title { get; set; }
    public String Description { get; set; }
}

是否可以将这种 1:n 关系投射到单个实体中?

在 Entity Framework 出现之前,我只是用 ADO.NET 将两个表连接起来并手动填充 Event 对象。

我分别阅读的大多数文章都假设您想在两个实体上映射 1:n 关系。我也尝试过实体拆分,但它似乎是为了使用 1:1 关系。

任何帮助表示赞赏。

【问题讨论】:

  • Is it possible to ... 是非常糟糕的问题 - 而是问 如何... - 顺便说一句,是的,有可能:o )

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


【解决方案1】:

您可以使用 LINQ 表达式

IList<Event> queryA = ( from e in context.CalenderEvents
                        join w in context.CalenderWeeks 
                          on e.CalenderWeek_Id equals w.Id
                        select new Event
                        {
                            Id = e.Id,
                            Year = w.Year,
                            Week = w.WeekNumber,
                            Title = e.Title,
                            Description = w.Description,
                        } ).ToList();

或 lambdas

IList<Event> queryB = context.CalenderEvents
    .Include( e => e.CalenderWeek )
    .Select( e => new Event
    {
        Id = e.Id,
        Description = e.CalenderWeek.Description,
        Title = e.Title,
        Week = e.CalenderWeek.WeekNumber,
        Year = e.CalenderWeek.Year,
    } ).ToList();

【讨论】:

  • 非常感谢。我的关键学习:在这种情况下将实体类与服务域对象分开。
  • @devnull 是的,开始声明您的应用程序使用的数据服务(接口)和数据模型(类)。一种实现可能会使用带有某些实体类的 EF 数据上下文。但应该是独立的。
  • 搞定了,我更喜欢 lambda。 :) 再次感谢!
【解决方案2】:

可以说一个事件可能持续超过一个日历周。所以我们可以在Event class 中使用ICollectionDbSet

class Event
{
    public long Id { get; set; }
    public int Year { get; set; }
    public Byte Week { get; set; }
    public String Title { get; set; }
    public String Description { get; set; }
    public virtual ICollection<CalenderWeek> CalenderWeeks{ get; set; }
}

【讨论】:

  • 谁要求可能持续超过一个日历周
  • 感谢您回答 Murat,但@Sir Rufo 是正确的:我确实只有 1:n 的关系。一个事件只属于一个日历周,而一个日历周可能有多个事件。
  • 相反是正确的public virtual ICollection&lt;Event&gt; Events{ get; set; }可以在日历类中使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-18
  • 2013-10-28
  • 1970-01-01
相关资源
最近更新 更多