c# - Entity Framework 4.1 RTW Code First - POCO 一对多是否需要引用子实体和子实体主键?

标签 c# ef-code-first entity-framework-4.1

在一种情况下,您的父类又包含一个子类,映射实体的最佳模式是什么。

我见过很多建议,其中父类同时引用了子类和子类 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 属性如何保持同步以及是否会从数据库延迟加载。

最佳答案

这是 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();

有一个非常奇怪的部分,我正在为老 child 创建假人。我几乎可以肯定,如果我在附加父级并设置新子级之前不这样做,我将在保存更改期间遇到一些异常(在独立关联的情况下)。

关于c# - Entity Framework 4.1 RTW Code First - POCO 一对多是否需要引用子实体和子实体主键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5714800/

相关文章:

c# - 使用 C# 在应用程序购买收据中验证 iOS

c# - 如果您能够修改源代码,为什么还要使用扩展方法?

entity-framework - 与 WillCascadeOnDelete 的单向关联

database - 首先将 Oracle 与 EF 代码结合使用

c# - 如何让委托(delegate)引用方法的特定版本?

c# - 如何使用我的 nuget 包同时支持 .Net 6 和 .Net Framework 4.7.2

entity-framework - code first 一对一启用级联删除

ef-code-first - 使用共享主键关联时,EF 4.1 Code First 中的级联删除规则

entity-framework - Entity Framework 跟踪的开销是多少?

c# - Entity Framework Code First - 为什么我不能以这种方式更新复杂的属性?