EF4.1 Code First能同时表示1-1和1-many到同一个表吗?

时间:2011-03-25 05:52:45

标签: entity-framework entity poco ef-code-first entity-framework-4.1

高级问题:我想在桌面上进行速度查找,我与之有很多关系。

我有一个大型的类似日志的表,其中包含一个雇员表的外键。我希望从employee表到最近的日志条目(对于该员工)以及许多日志条目的常规集合之间存在关系。我只能使用一对多,只查询日志文件中的上一个时间戳和员工ID,但我更喜欢直接指针。

是否可以使用Annotations做这样的事情?

public class TagEntry
{
    public int TagEntryId { get; set; }

    public int TagId { get; set; }
    public DateTime LogTime { get; set; }
    public string log { get; set; }

    public virtual Tag tag { get; set; }
}

public class Tag
{

    public int TagId { get; set; }
    public TagEntry CurrentTagEntry { get; set; }
    public int TagEntryId { get; set; }

    public string someTagData { get; set; }
    public virtual ICollection<TagEntry> TagEntries { get; set; }
}

一种解决方案就是存储一个整数currentTagEntryId,但理想情况下我想引用带有tag.CurrentTagEntry.log类型表示法的Log。

1 个答案:

答案 0 :(得分:1)

不幸的是,通过映射无法做到这一点。您的CurrentTagEntry代表TagTagEntry之间的一对一关系,但同时TagTagEntry之间存在一对多关系。一对一映射要求两个实体共享主键=&gt;能够映射一对一的关系TagEntry的PK必须是FK到Tag。这显然会打破一对多的关系。

您必须将其作为辅助函数而不是映射。

例如,这可以用作帮助程序linq查询:

var lastLog = (from te in context.TagEntries
               where te.TagId == id
               orderby te.LogTime descending
               select te).FirstOrDefault();

或者这是辅助加载:

var entry = context.Entry<Tag>(tag);
if (!entry.Collection(t => t.TagEntries).IsLoaded)
{
    // Selective eager loading
    entry.Collection(t => t.TagEntries)
         .Query()
         .OrderByDescending(te => te.LogTime)
         .Take(1)
         .Load();
}

var tag = tag.TagEntries.FirstOrDefault();