有没有使用EF数据库优先方法来解释主题的任何流畅API教程?

9

关于Fluent API的教程有很多,但它们都是使用Entity Framework Code-First代码示例来解释的。由于我不了解Code-First,您是否知道任何使用EF Database-First方法解释该主题的Fluent API教程?

谢谢

3个回答

10
没有教程能够将Fluent API和数据库优先方法结合起来解释,因为Fluent API仅适用于基于代码的方法。如果您想通过数据库优先方法创建模型,则不需要使用Fluent API。
Fluent API(连同Code-First数据注释和约定)是一种在代码中定义模型细节的工具,例如字符串长度、属性是否必需以及关系类型-多对多、一对多等等。当使用Database-First或Model-First时,EDMX文件具有相同的目的-它包含模型的所有详细信息和映射定义。只有在使用Code-First时,Fluent API(+数据注释和约定)才替换EDMX文件。
如果您通过Database-First或Model-First创建模型,则将拥有表示您的模型的EDMX文件。您可以将T4 DbContext Generator应用于此EDMX文件。生成的文件具有两个与Code-First不同的特征:
  • 生成的连接字符串包含一个部分,引用将嵌入到程序集中的EDMX元数据:

    connectionString="metadata=res://*/Model.csdl
                              |res://*/Model.ssdl
                              |res://*/Model.msl;
                      ..."
    
  • 生成的上下文DbContext将拥有一个覆盖的OnModelCreating方法,它只会抛出一个异常:

  • protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }
    
    只要在连接字符串中保留元数据部分,EF就不会在此方法中调用OnModelCreating或Fluent API中的任何代码。元数据部分告诉EF你的模型是基于数据库或模型,元数据定义在嵌入式EDMX文件中而不是Fluent API中。
    但是,您可以从连接字符串中删除元数据部分,删除UnintentionalCodeFirstException并使用OnModelCreating中的Fluent API编写代码。您可以按照此过程通过Database-First创建初始模型,然后在此初始模型上进行进一步的Code-First开发。
    此时,您不再使用Database-First,而是使用Code-First,而且您所读到的有关Fluent API的所有内容都适用于您。

2
我会在一两天内将您的帖子标记为已回答,因为您已经回答了我的原始问题,但如果您有时间 - 我目前正在学习DBContext及其验证API。无论如何,我认为验证API也可以与Database-First一起使用,即使Database-First不使用Fluent-API? - user702769
1
@user702769:嗯,好问题...我真的不知道。我从来没有在数据库优先模式下使用过验证功能。也许你可以提一个新问题问一下这个。 - Slauma
感谢您的帮助,我会做到的。非常感谢。 - user702769

3

有一篇有趣的文章介绍了如何在不使用实际“数据库优先”方法的情况下实现某些“数据库优先”目标。

http://agilenet.wordpress.com/2011/04/11/entity-framework-4-1-rc-with-an-existing-database/

作者使用“Code-First”和“Fluent API”,但禁用了数据库和表的自动生成和填充。他分享了一个示例,展示了“如何创建实体模型,然后手动创建数据库,再将这些实体映射到数据库。最后展示了使用DatabaseContext保存和检索实体”的过程。
他为每个实体创建一个“配置类”,该类在实体和数据库之间进行映射,这一步骤非常棒。这一步替代了正式的“Database-First”方法中会生成的“edmx”文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接