如何在 ASP.NET C# 中对带有外键的表进行 CREATE

问题描述 投票:0回答:1
{
   "FacilityID":"18c9aebb-0874-4fc2-900e-48f6b192797f",
   "FacilityRoomNumber":102,
   "FacilityPurpose":"DSFDSF",
   "LabTypeID":"bde03bf9-2fec-4d4c-bc00-e8fc605703a5",
   "LabType":{
      "LabTypeID":"bde03bf9-2fec-4d4c-bc00-e8fc605703a5",
      "LabTypeName":"CT Scan",
      "Facilities":[]
   },
   "LabResults":null
}

LabType
字段为必填项。

我正在创建一个以

LabTypeID
作为外键的设施。我可以从表中读取数据,这可能意味着所有 FK 和表都设置正确,但我可以添加到数据库中。尽管
LabType
字段具有值,但错误表明它是必需的,

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("FacilityRoomNumber,FacilityPurpose,LabTypeID")] Facility facility)
{
    facility.FacilityID = Guid.NewGuid();

    var labtype = await _context.LabTypes.FindAsync(facility.LabTypeID);
    if (labtype != null)
    {
        facility.LabType = labtype;
        _context.Entry(facility).State = EntityState.Modified; // ensure ef tracks the changes
    }
    else
    {
        ModelState.AddModelError(string.Empty, "the specified lab type does not exist.");
        return View(facility);
    }

    if (ModelState.IsValid)
    {
        Console.WriteLine("valid context");
        _context.Facilities.Add(facility);
        await _context.SaveChangesAsync();
        return RedirectToAction("index", "facilities");
    }
    else
    {
        string json = JsonConvert.SerializeObject(facility, new JsonSerializerSettings
        {
            ReferenceLoopHandling = ReferenceLoopHandling.Ignore
        });
        Console.WriteLine(json);
    }
    return View(facility);
}
c# asp.net-mvc entity-framework crud
1个回答
0
投票

如果尽管在

LabTypeID
实体中设置了
LabType
字段,但由于
facility
字段为空而收到错误,则可能是实体关系尚未正确设置。您可以检查以下步骤:

  1. 验证外键关系: 检查表属性的 ORM 工具中是否正确定义了外键关系。确保关系在数据库模式中正确映射。

  2. 在类定义中使用虚拟关键字: 如果您确定关系已正确建立,请确保在类定义中,使用

    virtual
    关键字声明关系中涉及的实体。例如:

    public class Facility
    {
        public int FacilityId { get; set; }
        public int LabTypeId { get; set; }
    
        // Use the virtual keyword for related entities
        public virtual LabType LabType { get; set; }
    }
    
    public class LabType
    {
        public int LabTypeId { get; set; }
        public string Name { get; set; }
    }
    
  3. 直接设置外键: 不设置

    facility.LabType
    字段,而是直接设置
    facility.LabTypeId
    字段。这可确保 ORM 正确处理关系。例如:

    Facility facility = new Facility();
    
    // Instead of this:
    // facility.LabType = someLabType;
    
    // Do this:
    facility.LabTypeId = someLabTypeId;
    
© www.soinside.com 2019 - 2024. All rights reserved.