如何在另一个对象中更新一个复杂对象的值

本文关键字:一个 复杂 对象 一个对象 更新 | 更新日期: 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服务器之旅