使用Entity框架6和Mysql连接器以及id的guid(如果有任何重要的话)。
我是EF的新手,我希望我只是做一些愚蠢的事情,但我找不到任何告诉我的事情。
如果我尝试通过id查找,则下面的工作将为null。
var job = _Context.JobRepository.Find(id);
但如果我先得到一个清单,那么选择工作
var tempList = _Context.JobRepository.ToList();
var job = _Context.JobRepository.Find(id);
它会正确加载它。我猜是因为它是从toList缓存的?但无论哪种方式它应该能够直接从数据库加载正确吗?如果不是如何从数据库中通过id选择单个对象?
如果我首先加载列表
,其他通过id选择一个对象的形式甚至都不起作用例如这些
var job = _Context.JobRepository.FirstOrDefault( h => h.Id == id );
var job = _Context.JobRepository.SingleOrDefault( h => h.Id == id );
var job = _Context.JobRepository.Where( h => h.Id == id ).FirstOrDefault();
var job = (from h in _Context.JobRepository where h.Id == id select h).FirstOrDefault();
我目前已经关闭了代理和延迟加载但是我已经尝试了它们都打开了。如果您需要更多信息,请询问(虽然我觉得它不应该与数据库/实体的结构有关,因为如果首先使用toList可以加载它)
编辑:添加模型
[DataContract, Table( "ada_job" )]
public class Job
{
//Members
//left out because they don't get mapped only properties do
public Job()
{
CheckConfigInterval = 15 * 60 * 1000;
}
//Properties
[NotMapped]
public JobId JobID { get; set; }
[Key, Column( "job_id" )] //Only used for saving / loading (I like strongly typed ids)
public virtual Guid Id { get { return ID; } set { ID = new JobId(value); } }
[DataMember, Column( "job_name" )]
public virtual String JobName { get; set; }
[DataMember, Column( "check_settings_interval" )]
public virtual int CheckConfigInterval { get; set; }
[Column( "last_checked_settings" )]
public virtual DateTime LastCheckedConfig { get; set; }
[Column( "date_modified" )]
public virtual DateTime DateModified { get; set; }
// left out unmapped properties
// left out functions
}
实际上课程还有更多,但我刚才用你在这里看到的结果进行了测试,结果是一样的。我从上下文中删除了所有其他DBS,所以没有任何东西损害我的测试。