gpt4 book ai didi

entity-framework-4.1 - EF 4.1 code-first SQL ce 4.0 更新集合异常

转载 作者:行者123 更新时间:2023-12-04 17:56:54 24 4
gpt4 key购买 nike

我首先在 SQL ce 4.0 中使用 EF 4.1 代码

我有两个类

public class Customer
{
public int ID { get; set; }

public string CompanyName { get; set; }

public List<ContactPerson> ContactPersons { get; set; }
}

public class ContactPerson
{
public int ID { get; set; }

public string Name { get; set; }

}

和一个 DbContext
public class MyDB : DbContext
{
public DbSet<ContactPerson> ContactPersons { get; set; }

public DbSet<Customer> Customers { get; set; }

public MyDB()
{
this.Configuration.LazyLoadingEnabled = true;
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Customer>()
.HasMany(c => c.ContactPersons)
.WithRequired()
.WillCascadeOnDelete(true);
}
}

同时在代码中,我需要更新客户的 ContactPerson 的整个集合。
List<ContactPersons> modifiedContactPersons;
Customer customer = MyDB.Customers.Find(ID);
customer.ContactPersons = modifiedContactPersons;

当我调用 MyDB.SaveChanges() 时,出现以下异常:

An error occurred while saving entities that do not expose foreign key properties for their relationships. The EntityEntries property will return null because a single entity cannot be identified as the source of the exception. Handling of exceptions while saving can be made easier by exposing foreign key properties in your entity types. See the InnerException for details.



带有内部异常:

A relationship from the 'Customer_ContactPersons' AssociationSet is in the 'Deleted' state. Given multiplicity constraints, a corresponding 'Customer_ContactPersons_Target' must also in the 'Deleted' state.



我明白这意味着什么,但我无法自己解决问题。
有什么建议?

最佳答案

这里的问题是:

customer.ContactPersons = modifiedContactPersons;

它用新的相关联系人列表替换旧的相关联系人列表,并执行两个操作:
  • 它首先将与之前所有相关人员的关系标记为 Deleted
  • 然后附加所有新契约(Contract)人并将与他们的关系标记为Added

  • 第一个操作是一个问题,因为删除关系不会删除相关实体,所以你最终会得到 ContactPerson与任何 Customer 无关并且您的映射不允许它(FK 不可为空)。

    解决此问题取决于您要达到的要求。如果您真的想先删除所有相关人员,则必须在分配新列表之前将每个人的状态设置为手动删除。如果您想更新现有人员,则根本不应该这样做。您应该迭代与客户相关的人员并从新列表中修改他们的数据。为什么?因为:
  • 如果您删除实体并插入一个新实体而不是更新现有实体,您将有两个数据库修改语句而不是一个 = 两次到数据库的往返而不是一次,并且在许多实体的情况下,它会大大减慢您的应用程序
  • 如果您有任何其他实体依赖于 ContractPerson你不能删除它。此外,如果您使用 ContractPersonId某处,如果它是自动生成的,则删除原始记录后它将不再存在。
  • 这通常是非常错误和懒惰的方法。插入新记录,修改现有记录,只删除真正应该删除的记录。
  • 关于entity-framework-4.1 - EF 4.1 code-first SQL ce 4.0 更新集合异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6744889/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com