Entity Framework 4.1 RTW Code First - POCO 一对多是不是需要引用子实体和子实体主键?
Posted
技术标签:
【中文标题】Entity Framework 4.1 RTW Code First - POCO 一对多是不是需要引用子实体和子实体主键?【英文标题】:Entity Framework 4.1 RTW Code First - Does POCO one to many need reference to child entity and child entities primary key?Entity Framework 4.1 RTW Code First - POCO 一对多是否需要引用子实体和子实体主键? 【发布时间】:2011-04-19 10:13:04 【问题描述】:在您的父类有一个子类的情况下,映射实体的最佳模式是什么。
我已经看到很多建议,其中父类同时引用了子类和子类 ID。例如
public class Parent
public int Id
get;
set;
public int ChildId
get;
set;
public virtual Child Child
get;
set;
public class Child
public int Id
get;
set;
public class ParentMapping : EntityTypeConfiguration<Parent>
public ParentMapping()
HasKey(x => x.Id);
HasRequired(X => x.Child)
.WithMany()
.Map(x => x.ToTable("Parent")
.MapKey("ChildId"));
使用这种模式,在保存父级时,如果您想将子级换成不同的但现有子级,我看到的示例只是更新 ChildId 而不是感觉错误的 Child,因为对象与自身不同步。
没有 ChildId 的代码看起来更整洁,但是在这种模式下,我无法使用现有的孩子来保存父母,因为 EF 正在尝试保存新的孩子。
public class Parent
public int Id
get;
set;
public virtual Child Child
get;
set;
什么是最好的模式,我想知道是否需要 ChildId,然后 Child 属性如何保持同步以及它是否会从数据库中延迟加载。
【问题讨论】:
【参考方案1】:这是foreign key and independent association 之间的区别。使用外键关联时,您实际上可以只使用键而不加载相关对象。如果您加载了参考,它会使参考不同步——情况并非总是如此。如果您想保持参考同步,您几乎又回到了必须通过独立关联解决的情况。
如果你暴露了外键,你应该使用它,因为它让很多事情变得更容易。如果您使用独立关联,您应该执行以下操作:
var parent = GetUpdatedParentSomehow();
// Dummy object for the old child if the relation is not loaded
parent.Child = new Child Id = oldChildId ;
// Attach the parent
context.Parents.Attach(parent);
// Create dummy for new child (you can also load a child from DB)
var child = new Child ID = newChildId ;
// No attach the child to the context so the context
// doesn't track it as a new child
context.Childs.Attach(child);
// Set a new child
parent.Child = child;
// Set parent as modified
context.Entry(parent).State = EntityState.Modified;
context.SaveChanges();
有一个非常奇怪的部分,我正在为老孩子创建假人。我几乎可以肯定,如果我在附加父级并设置新子级之前不这样做,我会在保存更改期间遇到一些异常(在独立关联的情况下)。
【讨论】:
以上是关于Entity Framework 4.1 RTW Code First - POCO 一对多是不是需要引用子实体和子实体主键?的主要内容,如果未能解决你的问题,请参考以下文章
Entity Framework 4.1 InverseProperty 属性和ForeignKey
Entity Framework 4.1 Fluent API 属性
卸载 Entity Framework 4.1 六月 CTP