我有一些简单的对象
public class DataClass
{
public int id;
public string Data;
}
public class Job()
{
public int id;
}
public class NewJob : Job
{
public DateTime StartDate;
public DataClass data;
}
然后我在dBContext()
中定义了它们 public DbSet<Job> Jobs { get; set; }
public DbSet<DataClass> DataClass { get; set; }
现在,如果我使用以下代码
NewJob job = (NewJob) db.Jobs.Find(id);
这样可以正常工作但将“data”返回为null
我知道我使用virtual关键字定义了类,它可以工作并填充“data”对象。
public class NewJob : Job
{
public DateTime StartDate;
public virtual DataClass data;
}
但在我的情况下,我“通常”不希望填充“数据”对象。所以我需要按需加载它。
如果我尝试类似
的话NewJob job = (NewJob)db.Jobs.Include("data").First();
我得到了一个例外
指定的包含路径无效。 EntityType'Model.Job'未声明名为'data'的导航属性。
我想这是因为当它试图做包含时它正在看“工作”而不是“NewJob”。
我也不喜欢带字符串的include - 没有设计时检查。
答案 0 :(得分:1)
看起来你正试图通过类型转换将数据对象转换为你的域对象,这是一个非常糟糕的主意。您要做的是获取数据对象,实例化域对象,并使用某种类型的帮助程序类将数据值映射到域对象。我一直在使用的一个非常有用的工具是Automapper。它是一个允许您将一个对象映射到另一个对象的工具。如果两个对象之间的命名约定不同,它还允许使用正则表达式来帮助映射。
答案 1 :(得分:0)
如果您正在使用Entity Framework Code First并且想要创建派生类/实体的实例,则应执行以下操作:
using (var db = new MyDbContext())
{
var newJob = db.Jobs.Create<NewJob>();
newJob.data.Data = "some data for a new job"; // this is string Data from DataClass
db.Jobs.Add(newJob);
db.SaveChanges();
}
答案 2 :(得分:-1)
经过大量搜索,我发现以下内容可以提供帮助。
如果在using子句中包含System.Data.Entity命名空间,则可以在 OfType&lt;&gt;()之后使用扩展方法 .Include()通常不可用。
稍有不同的代码示例
using System.Data.Entity;
NewJob job = (NewJob)db.Jobs.OfType<NewJob>().Include(m => m.data).Where(x => x.id == id).FirstOrDefault();
在我使用的例子中,这似乎对我有用。