Entity framework EF4.1代码能否首先将同时的1-1和1-many表示为同一个表?

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 {

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

我有一个类似于日志的大表,其中有一个employee表的外键。我希望有一个从employee表到最新日志条目(对于该员工)的关系,以及许多日志条目的常规集合。我可以只使用一对多,只查询日志文件上的最后一个时间戳和员工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; }
}
公共类标记项
{
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();