如何使用 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<MyEntity>().ToTable("MyEntityTable");
所以不,这不是更清洁的方法,除非您还有其他为这个实体做的映射。以上是关于如何使用 Entity Framework Code First Fluent API 指定表名的主要内容,如果未能解决你的问题,请参考以下文章
Entity Framework 学习系列 - 认识理解Entity Framework
如何使用 Entity Framework Core 模拟异步存储库
如何使用 Entity Framework 生成和自动递增 Id