0

我正在 VS 2012 中使用 EF 5 开发解决方案,我对在添加和更新实体时指定实体关系的正确方法感到困惑。

这些是我的主要课程,其中notifiera 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.

谁能解释一下为什么需要这条线。谢谢

4

1 回答 1

2

当您更新现有实体时,在您进行更改之前,该实体已经填充了 NotifierType(导航属性)和 NotifierTypeID。如果您随后更改 NotifierTypeID 但不更新 NotifierType,Entity Framework 会检测到潜在的不一致 (NotifierTypeID != NotifierType.NotifierTypeID) 并引发您遇到的异常。这就是为什么您需要在更新时同时设置两者。添加时,您没有这个问题,因为只定义了一个 ID(NotifierTypeID,但不是 NotifierType.NotifierTypeID),所以它只使用那个。

如果您想避免检索通知器类型以进行更新,您应该能够将其设置为 null,在这种情况下不会有差异,它可以只使用您设置的 NotifierTypeID:

notifier.MyCaseID = MyCaseID;
notifier.NotifierType = null;
notifier.NotifierTypeID = notifierView.NotifierTypeID;

希望有帮助!

于 2013-10-11T16:42:03.453 回答