0

我有一些简单的对象

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);

这工作正常,但返回“数据”为空

我知道我用 virtual 关键字定义了这个类,它可以工作并填充“数据”对象。

public class NewJob : Job
{
    public DateTime StartDate;
    public virtual DataClass data;
}

但在我的情况下,我“通常”不希望填充“数据”对象。所以我需要按需加载它。

如果我尝试类似

NewJob job = (NewJob)db.Jobs.Include("data").First();

我得到一个例外

指定的包含路径无效。EntityType 'Models.Job' 没有声明名为 'data' 的导航属性。

我想这是因为它在尝试包含时正在查看“工作”而不是“NewJob”。

我也不喜欢带有字符串的包含 - 没有设计时检查。

4

3 回答 3

1

看起来您正试图通过类型转换将数据对象转换为域对象,这是一个非常糟糕的主意。您想要做的是获取您的数据对象,实例化您的域对象,并使用某种类型的帮助器类将您的数据值映射到域对象。我一直在使用的一个非常有用的工具是 Automapper。它是一种工具,可让您将一个对象映射到另一个对象。如果两个对象之间的命名约定不同,它还允许使用正则表达式来帮助映射。

于 2013-04-03T21:30:37.933 回答
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();
}
于 2013-04-03T22:44:07.807 回答
-1

经过大量搜索,我发现以下内容可以提供帮助。

如果在 using 子句中包含 System.Data.Entity 命名空间,则可以在OfType <>( )之后使用扩展方法.Include(),这通常不可用。

略有不同的代码示例

 using System.Data.Entity; 

 NewJob job = (NewJob)db.Jobs.OfType<NewJob>().Include(m => m.data).Where(x => x.id == id).FirstOrDefault();

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

于 2013-04-03T22:51:37.700 回答