除非先调用toList,否则实体框架查找失败

时间:2014-04-22 23:06:44

标签: c# entity-framework c#-4.0 mysql-connector

使用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,所以没有任何东西损害我的测试。

0 个答案:

没有答案