在 EF6 中确定 SQL 架构到 DbSet 对象

Posted

技术标签:

【中文标题】在 EF6 中确定 SQL 架构到 DbSet 对象【英文标题】:Determine SQL schema to DbSet object in EF6 【发布时间】:2014-01-05 21:42:54 【问题描述】:

我有代码

const string schamaName = "schema";

public class Data: DbContext

    public DbSet<Offer> Offers get;set;
    public DbSet<Place> Placesget;set;


public class Offer

    public int Id get;set;
    public string Name get;set;
    IEnumerable<Place> Places get;set;


public class Place

    public int Id get;set;
    public string Name get;set;

这段代码将为我生成三个表,一个用于 Offer,一个用于 Place,一个用于前两个表之间的映射。现在我得到了想要的结构,但是在 dbo 模式中。我想把表 Offer 和“offer”模式中的映射,“dict”模式中的第三个表 我该怎么做? 我使用 EF6。 我更喜欢在 OnCreatingModel 方法中编写一些代码而不是使用属性

【问题讨论】:

【参考方案1】:

我认为您应该将 Offers 包含为虚拟集合,而不是 DbSet:

public class Data

    public int Id get;set;
    public string Name get;set;
    public virtual Collection<Offer> Offers get; set;

此外,如果您的架构真的是“架构”而不是“dbo”,那么您需要按如下方式装饰您的类:

[Table("Data", Schema="schema"]
public class Data

...

或者,如果您更喜欢 OnModelCreating():

modelBuilder.Entity<Data>().ToTable("Data", "schema");

【讨论】:

我已经编辑了答案以包括 OnModelCreating() 。如果您的表在 dbo 架构中,那么您无需手动覆盖代码中的架构。 我提出的问题不是我想要的代码。你能再看看我的问题吗?感谢您的时间和关注 1) 您应该声明“public virtual ICollection Places get; set; ”。 2) 如前所述 - 用 "[Table("table name", "schema name")]" 装饰每个实体以明确指定名称和模式。跨度> 您确定您正确使用了“模式”一词吗?在数据库中,“模式”是一个逻辑分区。在 SQL Server 中默认为“dbo”。

以上是关于在 EF6 中确定 SQL 架构到 DbSet 对象的主要内容,如果未能解决你的问题,请参考以下文章

EF6 中的这个 Test DBSet 类可以适应 EF Core 吗?

EF6基础系列(12)--- EF进行批量添加/删除

EF 6.0 中缺少 DbSet<entity>.Load() 函数

在EF6中切换MySQL / SQL Server

实体框架,查询包含上下文更改的dbset,而不调用保存更改

使用带有DbSet的接口,可以使用EF Core吗?