了解实体框架的默认行为:子对象持久化
在利用实体框架 (EF) 时,一种广泛采用的对象关系映射 (ORM) ) .NET 框架,了解其有关子实体的行为至关重要。默认情况下,EF 假定保存实体时,任何关联的子对象都应与其一起保存。但是,此默认操作可能会导致不必要的后果,特别是如果您打算跳过子实体持久化。
从持久化中排除子实体的原因
您可能会遇到以下情况不希望保存子实体的情况。例如,当从外部源(例如平面文件)手动填充数据时,数据库中的现有实体可能已经履行了子实体的角色。将重复项插入数据库可能会导致不一致和完整性问题。此外,在为子实体分配主键之前保存子实体可能会妨碍 EF 的正常操作。
强制选择性持久化:未更改的 EntityState
解决跳过子实体持久化的挑战,您可以利用 EntityState.Unchanged 选项。通过显式将子实体的状态设置为 Unchanged,您可以指示 EF 在保存操作期间忽略它。
使用 EntityState.Unchanged 的代码示例
考虑以下内容代码示例,假设您有一个带有 City 子实体的 School 实体:
public School Insert(School newItem) { using (var context = new DatabaseContext()) { context.Set<School>().Add(newItem); context.Entry(newItem.City).State = EntityState.Unchanged; context.SaveChanges(); return newItem; } }
通过设置 City当实体的状态为 Unchanged 时,EF 会将其从保存操作中排除,使数据库保持不变。但是,这种方法需要手动处理子实体的分配。
替代解决方案:利用外键
更优雅和灵活的解决方案涉及利用外键。通过在子实体中定义外键属性,您可以显式指定其与父实体的关系。然后,EF 将根据提供的引用自动处理关联实体的状态。
使用外键的代码示例
这里是之前使用外键的代码示例的更新版本:
public class School { public int Id { get; set; } public string Name { get; set; } [ForeignKey("City_Id")] public City City { get; set; } [Required] public int City_Id { get; set; } } public School Insert(School newItem, int cityId) { using (var context = new DatabaseContext()) { // Set child entity to null to prevent insertion newItem.City = null; // Specify foreign key relationship without adding the child entity newItem.City_Id = cityId; context.Set<School>().Add(newItem); context.SaveChanges(); return newItem; } }
在这种情况下,您手动设置 City_Id 并取消 City 引用,指示 EF通过外键建立连接而不涉及子实体。这种方法简化了代码,避免了手动管理 EntityState 的需要。
结论
了解实体框架的默认行为并采用适当的技术(例如 EntityState.Unchanged 或利用外键),使开发人员能够控制和自定义子实体持久性,防止不必要的副作用并确保应用程序内的数据完整性。
以上是如何控制实体框架中子实体的持久性?的详细内容。更多信息请关注PHP中文网其他相关文章!