高级问题:我想在桌面上进行速度查找,我与之有很多关系。
我有一个大型的类似日志的表,其中包含一个雇员表的外键。我希望从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。
答案 0 :(得分:1)
不幸的是,通过映射无法做到这一点。您的CurrentTagEntry
代表Tag
和TagEntry
之间的一对一关系,但同时Tag
与TagEntry
之间存在一对多关系。一对一映射要求两个实体共享主键=&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();