实体框架将子对象添加到DB

时间:2016-03-31 03:56:07

标签: c# entity-framework linq

我目前停留在使用lamda查询向我的数据库添加新的子实体。 我的数据库的结构是Area与之有一对多的关系 Shifts

在我的播种数据库中,我在创建区域时填充了移位:

new Area() 
{
    AreaDesc = "Area 1",
    AreaActive = true,
    AreaCreatedDate = DateTime.Now,
    SHFID = new Shift() 
    {
        StartTime = new TimeSpan (5,30,00),
        EndTime = new TimeSpan (11, 00, 00),
        RequiredResources = 2,
        ShiftDesc = "AM Shift",
        ShiftDayID = 1
    }
}

这很好,我正在努力,可能由于对实体框架能力的简单缺乏理解,正在向现有的区域添加新的 Shift

到目前为止,我有以下

var AreaVal = _context.Areas.Where(a => a.AreaID == AreaID).ToList();

var Shift = new Shift
{ 
    Area = AreaVal,
    StartTime = StartTime,
    EndTime = EndTime,
    ShiftDayID = model.ShiftDayID,
    ShiftDesc = model.ShiftDesc
};

一旦我有了正确的区域(我有来自模型的ID),我可以加载区域并将其作为区域<传递/ strong> Shift 中的参数和实体框架会知道该怎么做。

我在解析器中遇到的错误是:

  

无法隐式转换类型(Generic.List为   Models.Area。

我也考虑过使用_context.Areas.Update()从另一个方向走,但是却无法很好地解决这个问题。

额外信息,模型结构

Shift.cs

public class Shift
{
    [Key]
    public int SHFID { get; set; }
    public TimeSpan StartTime { get; set; }
    public TimeSpan EndTime { get; set; }
    public int RequiredResources { get; set; }
    public string ShiftDesc { get; set; }
    public int ShiftDayID { get; set; }
    public DateTime ShiftExDateStart { get; set; }
    public DateTime ShiftExDateEnd { get; set; }
    public int ShiftExLevel { get; set; }
    public TimeSpan ShiftExStartTime { get; set; }
    public TimeSpan ShiftExEndTime { get; set; }
    public Area Area { get; set; }
}

Area.cs

public class Area
{
    [Key]
    public int AreaID { get; set; }
    public string AreaDesc { get; set; }
    public Boolean AreaActive { get; set; }
    public DateTime AreaCreatedDate { get; set; }
    public List<Shift> SHFID { get; set; }
    public Company Company { get; set;}
}

1 个答案:

答案 0 :(得分:2)

你走在正确的轨道上。

AreaVal需要是单个实体(Area),而不是实体列表(List<Area>)。然后它应该按预期工作。

更改行:

var AreaVal = _context.Areas.Where(a => a.AreaID == AreaID).ToList();

var AreaVal = _context.Areas.Where(a => a.AreaID == AreaID).Single();