问题:
我是EF和LINQ的新手,所以请容忍我。
我正在尝试使用数据库优先方法创建一个EF6模型。简单地说,我有两个数据库表tblUser和tblMilkMan,它们在UserID列上有一个外键关系。
为了避免循环引用和构造实体数据,我为这两个模型创建了DTO类。
我使MilkManDTO类包含了对UserDTO实例的引用(这可能很愚蠢,如果是的话,请引导我找到正确的方法).My的目标是能够加载送奶工和相关的用户数据。
无论如何,在我的API调用中,当我尝试按ID加载MilkMan时,我不知道如何加载相关的UserDTO。我在网上找到了如何加载相关实体而不是相关DTO的示例。
数据库模式:

模型:
MilkMan模型和DTO:
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:
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控制器方法:
// 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);
}发布于 2015-01-08 05:18:51
您可以嵌套一个new UserDTO并使用相同的初始化列表技术。
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,我们有一个空引用操作符.?,它使这个操作更加简洁。
https://stackoverflow.com/questions/27833348
复制相似问题