1

我有以下基于 EntityObject 的 EF 模型(属性写在这里作为保持代码更清洁的字段):

Booking 
{
   int BookingID;
   EntityCollection<BookingCustomer> BookingCustomers;
   string Notes;
}

BookingCustomer 
{
   Customer Customer;
   Booking Booking;
   int CustomerID;
   int BookingID;
   string Notes;
}

Customer 
{
   int CustomerID;
   string Name;
}

我以分离的方式加载对象图:

Booking existingBooking;
using(MyContext ctx = new MyContext())
{
    ctx.Bookings.MergeOption = MergeOption.NoTracking;
    ctx.BookingCustomers.MergeOption = MergeOption.NoTracking;
    ctx.Customers.MergeOption = MergeOption.NoTracking;
    existingBooking = ctx.Bookings
       .Include("BookingCustomers")
       .Include("BookingCustomers.Customer")
       .First();
}

修改预订和客户数据:

existingBooking.Notes = "Modified";
existingBooking.BookingCustomers.First().Name += " Edited";

保存它:

using(MyContext ctx = new MyContext())
{
        ctx.Bookings.Attach(existingBooking);
        ctx.ObjectStateManager.GetObjectStateEntry(existingBooking ).SetModified();
        ctx.Refresh(RefreshMode.ClientWins, existingBooking);    
        ctx.SaveChanges();
} 

我创建了一条的客户记录(而不是更新了现有记录)。

我也试过这个:

using(MyContext ctx = new MyContext())
{
    ctx.Customers.Attach(existingBooking.BookingCustomers.First());
    ctx.ObjectStateManager.GetObjectStateEntry(existingBooking.BookingCustomers.First()).SetModified();
    ctx.Refresh(RefreshMode.ClientWins, existingBooking.BookingCustomers.First());

    ctx.Bookings.Attach(existingBooking);
    ctx.ObjectStateManager.GetObjectStateEntry(existingBooking ).SetModified();
    ctx.Refresh(RefreshMode.ClientWins, existingBooking);    
    ctx.SaveChanges();
} 

但上线异常ctx.Customers.Attach(existingBooking.BookingCustomers.First());

System.InvalidOperationException: 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

2 回答 2

1

拉迪斯拉夫是正确的。但是,您应该考虑另一种选择,它可以解决这个问题,并且仍然允许您保留分离的模型 - 自我跟踪 POCO。有一个 T4 模板(它与 VS2010 捆绑在一起或可以下载),它允许对象图跟踪其状态(这包括在图中添加/删除对象以及对象的哪些属性已更改)以便您可以重新附加已进行修改的图表;EF4 将为您找出更改并将其应用到对象状态管理器。

于 2011-08-04T09:38:57.027 回答
1

这不是提神醒脑。如果您在分离状态下修改图形,EF 将无法找到您所做的更改。您必须手动设置每个已修改实体或关系的状态。Attach将使整个图处于Unchanged状态并ChangeObjectState仅影响图中的单个实体。

您发现最简单的方法是在保存期间再次加载整个图表并手动将您的更改合并到附加图表。特别是如果您想删除一些关系/实体或对多对多关系进行复杂的操作,这将很方便。

于 2011-08-04T08:19:37.503 回答