【问题标题】:Error: EntityType does not declare a navigation property with the name [duplicate]错误:EntityType 未声明名称为 [重复] 的导航属性
【发布时间】:2013-07-08 16:02:44
【问题描述】:

我正在尝试计算预算减去费用并将其显示在视图中。我有计算工作,但我坚持如何将结果合并到我的视图中。现在我收到错误:

EntityType TETSModel.Project 没有声明一个名为 data 的导航属性。

如果没有声明 projects = from s in db.Projects.Include(p => data) select s; 这可以正常工作,但不显示余额。

有人可以告诉我怎么做吗?

从控制器:

public ViewResult Index()
{
    var data = (from p in db.Projects
                join ex in db.ExpenseItems on p.ProjectKEY equals ex.ProjectKEY
                group ex by p into exgroup
                select new Classes.Budget
                {
                ProjectKEY = exgroup.Key.ProjectKEY,
                OverallBudgetMinusExpenses = exgroup.Key.OverallTechnologyBudget - exgroup.Sum(g => g.ExpenseAmount),
                CurrentBudgetMinusExpenses = exgroup.Key.CurrentPeriodBudget - exgroup.Sum(g => g.ExpenseAmount)
                    });
    var projects = from s in db.Projects.Include(p => p.ContractType).Include(p => p.Division)
               select s;
    projects = from s in db.Projects.Include(p => data)
               select s;
    return View(projects.ToList());
}

在视图中:

@model IEnumerable<TETS_DAL.Project>

@{
ViewBag.Title = "Projects";
}
<h2>All Projects</h2>
<p>
@Html.ActionLink("Create New Project", "Create")
</p>
@using (Html.BeginForm())
{
    <table style="padding: 5px 5px 5px 5px;">
    <tr>
        <th>
            <!--@Html.DisplayNameFor(model => model.ProjectKEY)-->
        </th>
        <th>Project<br />
            Number
        </th>
        <th>Office
        </th>
        <th>Project<br />
            Description
        </th>
        <th>Start<br />
            Date
        </th>
        <th>End<br />
            Date
        </th>
        <th>Current<br />
            Period<br />
            Start
        </th>
        <th>Current<br />
            Period<br />
            End
        </th>
        <th>Total<br />
            Budget
        </th>
        <th>Total<br />
            Budget<br />
            Balance
        </th>
        <th>Current<br />
            Budget
        </th>
        <th>Current<br />
            Budget<br />
            Balance
        </th>
        <th></th>
    </tr>

    @foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.HiddenFor(modelItem => item.ProjectKEY)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.ProjectNumber)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Division.DivisionName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.ProjectDescription)
            </td>
            <td>
                @String.Format("{0:d}", item.StartDate)
            </td>
            <td>
                @String.Format("{0:d}", item.OverallEndDate)
            </td>
            <td>
                @String.Format("{0:d}", item.CurrentPeriodStartDate)
            </td>
            <td>
                @String.Format("{0:d}", item.CurrentPeriodEndDate)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.OverallTechnologyBudget)
            </td>
            <td>
                @*  @Html.DisplayFor(modelItem => item.ExpenseItem.ExpenseAmount)*@
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.CurrentPeriodBudget)
            </td>
            <td>

            </td>
            <td>
            @Html.ActionLink("Edit", "Edit", new { id = item.ProjectKEY }) |
            @Html.ActionLink("Details", "Details", new { id = item.ProjectKEY }) |
            @Html.ActionLink("Expenses", "Index", "ExpenseItem", new { projectSearchString = item.ProjectNumber }, null)
            </td>
        </tr>
    }
</table>

}

预算类:

public class Budget
{
[Key]
public int ProjectKEY { get; set; }
public decimal? OverallBudgetMinusExpenses { get; set; }
public decimal? CurrentBudget { get; set; }
public decimal? CurrentBudgetMinusExpenses { get; set; }
public decimal? OverallBudget { get; set; }
}

项目模型:

namespace TETS_DAL
{
using System;
using System.Collections.Generic;

public partial class Project
{
    public Project()
    {
        this.ExpenseItems = new HashSet<ExpenseItem>();
    }

    public int ProjectKEY { get; set; }
    public Nullable<int> DivisionKEY { get; set; }
    public Nullable<int> ContractTypeKEY { get; set; }
    public string ProjectNumber { get; set; }
    public string ProjectDescription { get; set; }
    public Nullable<System.DateTime> StartDate { get; set; }
    public Nullable<System.DateTime> OverallEndDate { get; set; }
    public Nullable<System.DateTime> CurrentPeriodStartDate { get; set; }
    public Nullable<System.DateTime> CurrentPeriodEndDate { get; set; }
    public Nullable<decimal> OverallTechnologyBudget { get; set; }
    public Nullable<decimal> CurrentPeriodBudget { get; set; }
    public string Notes { get; set; }
    public Nullable<System.DateTime> CreateDate { get; set; }
    public Nullable<bool> Archive { get; set; }
    public Nullable<System.DateTime> LastUpdate { get; set; }
    public byte[] ts { get; set; }

    public virtual ContractType ContractType { get; set; }
    public virtual Division Division { get; set; }
    public virtual ICollection<ExpenseItem> ExpenseItems { get; set; }
}
}

【问题讨论】:

  • 你能发布Project 模型吗?
  • 项目模型根据您的要求发布
  • 就像错误告诉你的那样......你的 Project 类没有 data 导航属性。
  • 对不起,我是新手,不知道这意味着什么。我查了一下,仍然不清楚我应该做什么。
  • 您的Project 类没有名为data 的属性。这行from s in db.Projects.Include(p =&gt; data) 将在您的Project 类中查找名为data 的属性。

标签: c# asp.net-mvc


【解决方案1】:

你有这些行:

var projects = from s in db.Projects.Include(p => p.ContractType).Include(p => p.Division)
           select s;
projects = from s in db.Projects.Include(p => data)
           select s;

为什么要给变量projects 赋值两次?

此外,正如您问题的 cmets 中所述,lambda 表达式 p =&gt; data 表示:“对于每个 p,返回其 data 属性。”但是,根据您收到的错误消息,Project 类型没有名为data 的属性。这就是您收到错误消息的原因。

但我想我明白你想要做什么。您希望模型中的变量数据同时拥有Project 对象和Budget 项目吗?您可能需要定义另一个包含 Project 属性和 Budget 属性的类:

public ProjectViewModel
{
    Project Project { get;set;}
    Budget Budget { get;set;}
}

...并编写一两行 LINQ 以创建来自 projectsdataProjectViewModel 对象的集合,加入(我假设)它们共有的 ProjectKEY 属性。

【讨论】:

  • +1。我想知道 OP 是否对您可以专门化查询感到困惑,例如...做最初的var projects = blah,然后根据条件进一步专门化:if(some_condition_only_op_knows()) projects = projects.Where(p =&gt; *another condition*);.. 但您可能是对的。需要LINQ培训吗? :)
  • 附加课程就是答案。谢谢!
  • 如果我的回答对您有所帮助,请考虑将其标记为您接受的答案。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多