我正在使用VS 5在VS 2012中开发解决方案,我很困惑在添加和更新实体时指定实体关系的正确方法。
这些是我的主要课程notifier
是person
:
public class Notifier : Person
{
public bool IsValid { get; set; }
public int NotifierTypeID { get; set; }
public virtual NotifierType NotifierType { get; set; }
public int MyCaseID { get; set; }
public virtual MyCase MyCase { get; set; }
}
public abstract class Person
{
public int PersonID { get; set; }
public String Name { get; set; }
}
通知者属于案例
public class MyCase
{
public int MyCaseID { get; set; }
public DateTime DateOfNotification { get; set; }
public virtual ICollection<Notifier> Notifiers { get; set; }
}
并有一个类型:
public class NotifierType
{
public int NotifierTypeID { get; set; }
public string NotifierTypeName { get; set; }
}
我在通知程序和案例以及通知程序类型之间公开了外键。
我用来添加/更新通知程序的方法是:
using (MyContext dbContext = new MyContext(connectionString))
{
notifier.MyCaseID = MyCaseID;
notifier.NotifierTypeID = notifierView.NotifierTypeID;
// **** the puzzling line ****
notifier.NotifierType = dbContext.NotifierTypes.Find(notifierView.NotifierTypeID);
//dbContext.Database.Log = s => System.Diagnostics.Debug.Write(s);
dbContext.Entry(notifier).State = notifier.PersonID == 0 ? EntityState.Added : EntityState.Modified;
dbContext.SaveChanges();
// save the ID in case it's new
notifierViewReturn.PersonID = notifier.PersonID;
}
我对上面评论**** the puzzling line ****
之后的界限感到困惑。我明确指定了外键,如果我要添加一个通知程序,则不需要这一行,但如果我更新对象,我确实需要它,否则会引发异常。
例外是
Message=A referential integrity constraint violation occurred:
The property values that define the referential constraints are not
consistent between principal and dependent objects in the relationship.
任何人都可以解释为什么需要这条线。感谢
答案 0 :(得分:2)
更新现有实体时,在进行更改之前,实体已经填充了NotifierType(导航属性)和NotifierTypeID。如果您随后更改了NotifierTypeID但未更新NotifierType,则Entity Framework会检测到潜在的不一致性(NotifierTypeID!= NotifierType.NotifierTypeID)并抛出您获得的异常。这就是您需要在更新时设置两者的原因。添加时,您没有此问题,因为只定义了其中一个ID(NotifierTypeID,而不是NotifierType.NotifierTypeID),所以它只使用那个。
如果您想避免检索更新的通知程序类型,您应该只能将其设置为null,在这种情况下不会出现差异,它只能使用您设置的NotifierTypeID: / p>
notifier.MyCaseID = MyCaseID;
notifier.NotifierType = null;
notifier.NotifierTypeID = notifierView.NotifierTypeID;
希望有所帮助!