如何使用 Entity Framework Code First Fluent API 指定表名

Posted

技术标签:

【中文标题】如何使用 Entity Framework Code First Fluent API 指定表名【英文标题】:How to specify table name with Entity Framework Code First Fluent API 【发布时间】:2013-12-09 16:21:32 【问题描述】:

我有一个实体,我要配置实体框架以将其映射到具有不同名称的数据库表。

我可以使用 Code First DataAnnotations (DataAnnotations.Schema.TableAttribute) 轻松做到这一点。

但由于限制,现在我必须使用 Code First Fluent API(我的域对象将被外部客户端使用,因此它们不应该是特定于技术的 - 例如对 DataAnnotations 有任何引用)

我在 MSDN 上搜索过,但一无所获。那么这是否可能以及如何实现?

谢谢。

【问题讨论】:

一般来说,您应该创建 DTO(数据传输对象)并将您的 EF 对象映射到它们,除非您正在开发一个小型/琐碎的应用程序,否则您永远不应该直接使用 EF 类。 【参考方案1】:

你也可以使用表格注解:

[Table("InternalBlogs")]
public class Blog

见: Code First Data Annotations

【讨论】:

谢谢,但如果你仔细阅读我的问题 - 你会直接在它的中间看到那个 apptoach :) 即使注释被命名为“表格”,它似乎也适用于视图和表格。 @JonSchneider 我只是在这里无缘无故地争论定义,但视图是只读表。 Table 注释位于 System.ComponentModel.DataAnnotations.Schema;. 这怎么得到更多的赞成票,问题清楚地要求流畅的api版本【参考方案2】:

您将使用.ToTable() 方法:

modelBuilder.Entity<Department>().ToTable("t_Department");   

来源:MSDN:http://msdn.microsoft.com/en-us/data/jj591617.aspx

【讨论】:

我更喜欢这个,因为我想把所有注释放在一个地方 它是否有任何验证表存在?我们重命名了一个表并且没有任何损坏,这是您期望的行为吗?它显然不能对重命名的表进行 CRUD,但它似乎并没有破坏任何东西......【参考方案3】:

使用 ToTable 方法:

public class MyEntityMap : EntityTypeConfiguration<MyEntity>

    public const string TableName = "MyEntity";

    public MyEntityMap()
                       
        ToTable(TableName);

        Property(t => t.Id);
    

【讨论】:

我认为将映射分解为类是最简洁的方法。 但是在您的 OnModelCreating 方法中,您必须这样做:modelBuilder.Configurations.Add(new MyEntityMap()); 而不是您可以添加一个 modelBuilder.Entity&lt;MyEntity&gt;().ToTable("MyEntityTable"); 所以不,这不是更清洁的方法,除非您还有其他为这个实体做的映射。

以上是关于如何使用 Entity Framework Code First Fluent API 指定表名的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Entity Framework 7 记录查询?

Entity Framework 学习系列 - 认识理解Entity Framework

如何使用 Entity Framework Core 模拟异步存储库

如何使用 Entity Framework 生成和自动递增 Id

如何使用 Entity Framework Core 正确保存 DateTime?

如何使用 Entity Framework Core 获取主键值