首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在DTO中加载DTO?

如何在DTO中加载DTO?
EN

Stack Overflow用户
提问于 2015-01-08 05:09:46
回答 1查看 1.3K关注 0票数 0

问题:

我是EF和LINQ的新手,所以请容忍我。

我正在尝试使用数据库优先方法创建一个EF6模型。简单地说,我有两个数据库表tblUsertblMilkMan,它们在UserID列上有一个外键关系。

为了避免循环引用和构造实体数据,我为这两个模型创建了DTO类。

我使MilkManDTO类包含了对UserDTO实例的引用(这可能很愚蠢,如果是的话,请引导我找到正确的方法).My的目标是能够加载送奶工和相关的用户数据。

无论如何,在我的API调用中,当我尝试按ID加载MilkMan时,我不知道如何加载相关的UserDTO。我在网上找到了如何加载相关实体而不是相关DTO的示例。

数据库模式:

模型:

MilkMan模型和DTO:

代码语言:javascript
复制
namespace MilkMan.Models
{
    using System;
    using System.Collections.Generic;

    public partial class tblMilkMan
    {
        public int RecordID { get; set; }
        public int UserID { get; set; }
        public bool IsMyTurn { get; set; }
        public int RoundRobinOrder { get; set; }

        public virtual tblUser tblUser { get; set; }
    }

    public class MilkManDTO
    {
        public int RecordID { get; set; }
        public int UserID { get; set; }
        public bool IsMyTurn { get; set; }
        public int RoundRobinOrder { get; set; }

        public virtual UserDTO User { get; set; }
    }
}

用户模型和DTO:

代码语言:javascript
复制
public partial class tblUser
    {
        public tblUser()
        {
            this.tblMilkMen = new HashSet<tblMilkMan>();
        }

        public int UserID { get; set; }
        public string LogonName { get; set; }           
        public string Password { get; set; }           
        public int PasswordExpiresAfter { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        :
        // more fields
        :
        public virtual ICollection<tblMilkMan> tblMilkMen { get; set; }
    }

    public class UserDTO
    {
        public int UserID { get; set; }       
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

Web控制器方法:

代码语言:javascript
复制
// GET api/MilkMan/5
        [ResponseType(typeof(MilkManDTO))]
        public async Task<IHttpActionResult> GettblMilkMan(int id)
        {
            //tblMilkMan tblmilkman = await db.tblMilkMen.FindAsync(id);

            MilkManDTO milkMan = await db.tblMilkMen.Select(b => new MilkManDTO()
            {
                RecordID = b.RecordID,
                UserID = b.UserID,
                IsMyTurn = b.IsMyTurn,
                RoundRobinOrder = b.RoundRobinOrder,
                User = //???? Error//

            }).SingleOrDefaultAsync(b => b.RecordID == id);


            if (milkMan == null)
            {
                return NotFound();
            }

            return Ok(milkMan);
        }
EN

回答 1

Stack Overflow用户

发布于 2015-01-08 05:18:51

您可以嵌套一个new UserDTO并使用相同的初始化列表技术。

代码语言:javascript
复制
        MilkManDTO milkMan = await db.tblMilkMen.Select(b => new MilkManDTO()
        {
            RecordID = b.RecordID,
            UserID = b.UserID,
            IsMyTurn = b.IsMyTurn,
            RoundRobinOrder = b.RoundRobinOrder,
            User = new UserDTO {
               UserID = b.User.UserID,
               FirstName = b.User.FirstName,
               LastName = b.User.LastName,
            } 

        }).SingleOrDefaultAsync(b => b.RecordID == id);

如果没有关联的用户,此代码可能会在b.User.UserID上抛出一个空引用异常,因此User可能为空。您需要处理这个问题,要么使用??合并、三元(b.User == null ? "DefaultFirstName" : b.User.FirstName),要么忽略整个引用User = (b.User == null ? (UserDTO)null : new UserDTO { ... })。让这种事情变得有趣。

对于C# 6,我们有一个空引用操作符.?,它使这个操作更加简洁。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27833348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档