1

高级问题:我想快速查找与我有一对多关系的表。

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

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

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 类型表示法来引用日志。

4

1 回答 1

1

不幸的是,这是通过映射无法实现的。您CurrentTagEntry代表 和 之间的一对一关系Tag,但同时您在和TagEntry之间具有一对多关系。一对一映射要求两个实体共享主键 => 才能映射一对一关系 TagEntry 的 PK 必须是 FK 到。这显然会打破一对多的关系。TagTagEntryTag

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

例如,这可以用作帮助 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();
于 2011-03-25T08:01:56.007 回答