【问题标题】:A table has two links to another table. How does .Include specify one of those links?一个表有两个指向另一个表的链接。 .Include 如何指定这些链接之一?
【发布时间】:2019-09-27 21:06:37
【问题描述】:

tblWorkOrder 通过 tblWorkOrder.EnteredBy 和 tblWorkorder.ClosedBy 有两个到 tblUser 的链接。下面的代码选择 ClosedBy 链接。如何指定 OpenedBy 链接?

public IEnumerable<SelectListItem> GetEnteredBy()
{
    using (var context = new FacilityEntities())
    {
        List<SelectListItem> user = context.tblWorkOrder.AsNoTracking().Include("tblUser")
            .GroupBy(x => new { x.tblUser.LastName, x.tblUser.FirstName, x.tblUser.UserID })
            .Select(x =>
            new SelectListItem
            {
                Value = x.Key.UserID,
                Text = string.Concat(x.Key.FirstName, " ", x.Key.LastName)
            }).ToList();
        var usertip = new SelectListItem()
        {
            Value = null,
            Text = "Select"
        };
        user.Insert(0, usertip);
        return new SelectList(user, "Value", "Text");
    }
}

【问题讨论】:

    标签: asp.net-mvc linq entity-framework-6


    【解决方案1】:

    您需要在 Entity 中定义关系,使用ForeignKey 属性明确定义哪个外键关联到哪个导航属性。

    public class tblWorkOrder 
    {
        public long? CloseById { get; set; } // ForeignKey
        [Foreignkey("CloseById")]  // CloseBy navigation property is associated to CloseById
        public tblUser CloseBy{ get; set; } // assuming tblUser is the name of your entity
    
        public long? EnteredById { get; set; }
        [ForeignKey("EnteredById")]
        public tblUser EnteredBy { get; set; }
    
        ...
    }
    

    正确定义导航属性后,您可以简单地将它们包含在查询中:

    context.tblWorkOrder.AsNoTracking().Include(r => r.CloseBy).Include(r => r.EnteredBy)
    ... 
    

    【讨论】:

    • 如果你的模型是这样的,那么它应该可以工作......也许问题出在其他地方。
    • 模型一开始是这样的: public partial class tblWorkOrder ... public virtual tblUser {get;设置;}公共虚拟tblUser1 {get; set;} ...我将其更改为:public int? CloseByID {get;放; } [ForeignKey("CloseByID")] 公共虚拟 tbluser CloseBy { get;放; } 公共整数? OpenByID {get;放; } [ForeignKey("OpenByID")] public virtual tbluser OpenBy { get;放;我试过这个: List user = context.tblWorkOrder.AsNoTracking().Include(r => r.EnterBy) 但出现错误:无法将 lambda espression 转换为类型“字符串”,因为它不是委托类型跨度>
    • 所以我把它改成了: List user = context.tblWorkOrder.AsNoTracking().Include("EnterBy") .GroupBy(x => new { x.Enterby.Firstname, x. Enterby.Lastname, x.EnterBy.UserID}) ... 编译,但我得到这个运行时错误: System.Data.Entity.Core.MetadataException: 'Schema specified is not valid。错误:没有加载关系“FacilityModel.FK_tblWorkOrder_tblCivilEngineering”,因为类型。 “FacilityModel.tblWorkOrder”不可用。
    • 很抱歉,在评论中阅读您的代码真的很难,这应该是其他人可以轻松阅读的问题。如果您需要有关原始模型的帮助,我建议您提出一个新问题并描述问题。
    猜你喜欢
    • 1970-01-01
    • 2021-08-24
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多