使用EF

时间:2015-09-29 16:00:16

标签: c# entity-framework odata asp.net-web-api2 asp.net-web-api

我正在尝试从ODataController返回自定义视图模型。这是视图模型:

public class TaskViewModel
{
    public int TaskID { get; set; }
    public string Name { get; set;}
    public string Details { get; set; }
    public DateTime? DueDate { get; set; }
    public virtual Project Project { get; set; }
}

我的控制器看起来像这样:

public IEnumerable<TaskViewModel> Get(ODataQueryOptions<TaskViewModel> options)
{
    IEnumerable<Task> tasks = db.Tasks.AsEnumerable();
    ...
    var vm = from t in tasks
             select new TaskViewModel
             {
                 TaskID = t.TaskID,
                 Name = t.Name,
                 Details = t.Details,
                 DueDate = t.DueDate,
                 Project = t.Project
             }
    return vm.AsEnumerable();
}

Task实体看起来像这样(从数据库优先EDMX生成):

public partial class Task
{
    public int TaskID { get; set; }
    public string Name { get; set; }
    public string Details { get; set; }
    public DateTime? DueDate { get; set; }
    ... //other properties I don't want exposed
    public virtual Project Project { get; set; }
}

当我尝试执行GET时,收到以下消息:

“实体集'任务'上的实体类型'MyApplication.ViewModels.TaskViewModel'找​​不到导航属性'Project'的NavigationLink工厂。尝试在EntitySetConfiguration上调用HasNavigationPropertyLink。”

这是我的WebApiConfig.cs:

builder.EntitySet<Project>("Projects").EntityType.HasKey(p => p.ProjectID);
builder.EntitySet<Task>("Tasks").EntityType.HasKey(t => t.TaskID);
...
builder.EntitySet<ViewModels.TaskViewModel>("TaskViewModel");

我已经成功地在应用程序(Project)中使用了另一个实体,所以我不知道为什么这个实体不起作用。唯一的区别是Task实体引用了Project实体。

感谢任何帮助/见解。

1 个答案:

答案 0 :(得分:1)

我能够让它运转起来。我所做的只是让TaskViewModel类成为Task的派生类。

自:

public class TaskViewModel
{
    public int TaskID { get; set; }
    ...
    public string CurrentStatus { get; set; }
}

要:

public class TaskViewModel : Task
{
    public string CurrentStatus { get; set; }
}

值得注意的是,这可以在WebApiConfig.cs中使用或不使用TaskViewModel的条目。