手动添加DbSet或允许自动创建表之间有什么区别吗?

时间:2011-09-27 19:16:53

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

我有一个名为TypeA的类型,TypeA中的某个地方有一个TypeB的属性(除了IDString之外什么都没有)

使用Entity Framework,我创建了DbSet TypeA - public DbSet<TypeA>

这样就可以很好地创建数据库中的TypeB列 - 但是,我现在需要为一些数据设定种子。由于原始TypeB中不存在DbContext,我无法向其提供数据。

因此我将public DbSet<TypeB>添加到原始DbContext,它甚至没有检测到数据库架构中的更改/差异。

所以,这让我感到疑惑,我的问题是,创建一个由关系自动创建的单独DbSet是否有任何区别?

示例代码

  public class TypeA
    {

        public int id { get; set; }


        public string name { get; set; }


        public TypeB foo { get; set; }
    }

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

        public string name { get; set; }
    }

1 个答案:

答案 0 :(得分:1)

是的,有区别。

在设计方面,DbSet类的要点是to embody the Repository pattern

  

从概念上讲,存储库封装了持久存储在数据存储中的对象集以及对它们执行的操作,从而提供了更加面向对象的持久层视图。存储库还支持在域和数据映射层之间实现清晰分离和单向依赖的目标。

其目的是为给定实体封装CRUD。为了做到这一点,存储库不能仅限于一个表。有时它必须与DB中的对象树一起使用。

在您的情况下,为这两种类型设置DbSet将为您提供直接访问该实体的存储库。这样,您就可以直接查询TypeB或直接在数据库中创建/更新TypeB个实例,而不必始终根据TypeA查询您的查询。

但其中一些取决于您的关联。如果您对TypeB的约束要求TypeA,则无法在没有TypeA的情况下创建约束。但是,您仍然可以直接查询它们。

您仍然可以在没有TypeB的情况下创建或更新DbSet<TypeB>个实例 - 只需将一个实例附加到TypeA实例,然后对DbSet<TypeA>进行操作。