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

时间:2014-07-25 06:11:30

标签: c# entity-framework

鉴于以下两个类(表示数据库中的表),我想将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中设置此值的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

由于可以访问此行中的StatusType

,因此会出现异常
mc.StatusType.Id = 3;

mc是一个新对象,没有定义StatusType。

1)解决此问题的最佳方法是使用FK字段StatusTypeId

mc.StatusTypeId = 3;

2)但是,如果您不能使用此字段,则其他解决方案如下:

您应该而不是设置Id(非现有StatusType)将其设置为现有类型。这会使DB额外往返以获取StatusType对象。

var statusType = MyMethodToGetExistingStatusType(3);
mc.StatusType = statusType;

我不知道如何获取你的Type类型的实例,但是在方法 MyMethodToGetExistingStatusType()中你可以处理它。

我希望这对你有帮助吗?

答案 1 :(得分:0)

你在MyClass课程中缺少你的FK。如果你添加

 Public int StatusTypeId {get;set;}

这会为您的实体映射FK。目前您只有一个导航属性。

然后而不是做

  mc.StatusType.Id = 3

你刚才

  mc.StatusTypeId = 3

这将使您不必从StatusType表中进行选择。这意味着更少的代码和更少的SQL服务器之旅。