MVC4和实体框架继承和包含

时间:2013-04-03 21:19:27

标签: entity-framework inheritance include

我有一些简单的对象

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 - 没有设计时检查。

3 个答案:

答案 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();

在我使用的例子中,这似乎对我有用。