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