Entity framework EF4.1代码能否首先将同时的1-1和1-many表示为同一个表?
高层次的问题:我想快速查找与我有一对多关系的表 我有一个类似于日志的大表,其中有一个employee表的外键。我希望有一个从employee表到最新日志条目(对于该员工)的关系,以及许多日志条目的常规集合。我可以只使用一对多,只查询日志文件上的最后一个时间戳和员工Id,但我更喜欢直接指针 有没有可能通过注释执行类似的操作Entity framework EF4.1代码能否首先将同时的1-1和1-many表示为同一个表?,entity-framework,entity,poco,ef-code-first,entity-framework-4.1,Entity Framework,Entity,Poco,Ef Code First,Entity Framework 4.1,高层次的问题:我想快速查找与我有一对多关系的表 我有一个类似于日志的大表,其中有一个employee表的外键。我希望有一个从employee表到最新日志条目(对于该员工)的关系,以及许多日志条目的常规集合。我可以只使用一对多,只查询日志文件上的最后一个时间戳和员工Id,但我更喜欢直接指针 有没有可能通过注释执行类似的操作 public class TagEntry { public int TagEntryId { get; set; } public int TagId {
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; }
}
公共类标记项
{
public int TagEntryId{get;set;}
public int TagId{get;set;}
公共日期时间日志时间{get;set;}
公共字符串日志{get;set;}
公共虚拟标记{get;set;}
}
公共类标签
{
public int TagId{get;set;}
公共标记项CurrentTagEntry{get;set;}
public int TagEntryId{get;set;}
公共字符串someTagData{get;set;}
公共虚拟ICollection标记项{get;set;}
}
一种解决方案是只存储一个整数currentTagEntryId,但理想情况下,我希望使用tag.CurrentTagEntry.Log类型表示法引用日志。不幸的是,通过映射这是不可能的。您的
CurrentTagEntry
代表了Tag
和TagEntry
之间的一对一关系,但同时您在Tag
和TagEntry
之间存在一对多关系。一对一映射要求两个实体共享主键=>才能映射一对一关系TagEntry的PK必须是FK到标记
。这显然会打破一对多的关系
您必须作为助手函数而不是映射来执行此操作
例如,这可以用作辅助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();
var entry=context.entry(标记);
如果(!entry.Collection(t=>t.TagEntries).IsLoaded)
{
//选择性急加载
entry.Collection(t=>t.TagEntries)
.Query()
.OrderByDescending(te=>te.LogTime)
.采取(1)
.Load();
}
var tag=tag.TagEntries.FirstOrDefault();
不幸的是,通过映射这是不可能的。您的CurrentTagEntry
代表了Tag
和TagEntry
之间的一对一关系,但同时您在Tag
和TagEntry
之间存在一对多关系。一对一映射要求两个实体共享主键=>才能映射一对一关系TagEntry的PK必须是FK到标记
。这显然会打破一对多的关系
您必须作为助手函数而不是映射来执行此操作
例如,这可以用作辅助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();
var entry=context.entry(标记);
如果(!entry.Collection(t=>t.TagEntries).IsLoaded)
{
//选择性急加载
entry.Collection(t=>t.TagEntries)
.Query()
.OrderByDescending(te=>te.LogTime)
.采取(1)
.Load();
}
var tag=tag.TagEntries.FirstOrDefault();