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 两个跟踪查询

Entity Framework 4.1 InverseProperty 属性和ForeignKey

Entity Framework 4.1 Fluent API 属性

卸载 Entity Framework 4.1 六月 CTP

通过 Entity Framework 4.1 中的用户定义函数进行热切加载

Entity Framework 4.1 - 映射错误的模式