如何在另一个对象中更新一个复杂对象的值
本文关键字:一个 复杂 对象 一个对象 更新 | 更新日期: 2023-09-27 18:14:48
给定以下两个类,它们表示数据库中的表,我想将MyClass的statustype设置为statustype DB中的两个预定义值之一。
public class MyClass
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
[DataType(DataType.MultilineText)]
public string Description { get; set; }
public virtual StatusType StatusType { get; set; }
}
public class StatusType
{
public int Id { get; set; }
public virtual ICollection<MyClass> MyClasses{ get; set; }
DataType(DataType.MultilineText)]
public string Description { get; set; }
}
存在第三个表(MyClass_StatusType),它不是由充当多对一中介的实体表示的。
我的代码: MyClass mc = new MyClass();
mc.Description = "Description";
mc.StatusType.Id = 3;
db.MyClasses.Add(mc);
var id = db.SaveChanges();
我的StatusType中有一条ID为3的记录。当我运行这段代码时,我在StatusType上得到一个空引用异常。
在MyClass中设置这个值的正确方法是什么?
您会得到异常,因为在这一行中访问了StatusType
mc.StatusType.Id = 3;
mc是一个新对象,没有定义StatusType。
1)最好的方法是使用FK字段StatusTypeId
mc.StatusTypeId = 3;
2)但是如果你不能使用这个字段,另一个解决方案是:
您不应该设置Id(不存在的StatusType),而应该将其设置为现有的类型。这需要额外往返数据库以获取StatusType对象。
var statusType = MyMethodToGetExistingStatusType(3);
mc.StatusType = statusType;
我不知道你怎么能得到你的类型的实例,但在方法 mymethodtotexistingstatustype ()你可以处理这个
我希望这对你有帮助。
您在MyClass类中丢失了FK。如果加上
Public int StatusTypeId {get;set;}
为您的实体映射一个FK。目前你只有一个导航属性。
然后不做
mc.StatusType.Id = 3
你只要做
mc.StatusTypeId = 3
这将使您不必从StatusType
表中进行选择。这意味着更少的代码和更少的SQL服务器之旅