{
"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);
}
如果尽管在
LabTypeID
实体中设置了 LabType
字段,但由于 facility
字段为空而收到错误,则可能是实体关系尚未正确设置。您可以检查以下步骤:
验证外键关系: 检查表属性的 ORM 工具中是否正确定义了外键关系。确保关系在数据库模式中正确映射。
在类定义中使用虚拟关键字: 如果您确定关系已正确建立,请确保在类定义中,使用
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; }
}
直接设置外键: 不设置
facility.LabType
字段,而是直接设置 facility.LabTypeId
字段。这可确保 ORM 正确处理关系。例如:
Facility facility = new Facility();
// Instead of this:
// facility.LabType = someLabType;
// Do this:
facility.LabTypeId = someLabTypeId;