zoukankan      html  css  js  c++  java
  • Entity Framework优缺点及使用方法总结

    Entity Framework是M$提供的一个ORM框架,它旨在为小型应用程序中数据层的快速开发提供便利。

    nuget上185W多的下载量,说明.Net开发人员还是比较喜欢用EF的。但是EF在提供了便利性的同时也有许多缺点,以下就是我认为不应该应用EF的场景:

    • 非SQL Server数据库且无该数据库的DataProvider
    • 高性能要求。在进行一些复杂查询的情况下,EF的性能表现不太好,而开发人员又无法控制SQL语句的生成
    • 高安全性要求。有时候DB用户仅仅具有EXEC的权限,而EF自动生成的类又不好用,还是需要自己来写。

    一些大中型企业应用往往具有以上几种情况,此时就不适合使用EF了。

    至于使用什么ORM,我个人认为NHibernate配置起来太麻烦,如果没什么太特殊的要求,可以试一下ServiceStack.OrmLite能不能满足需求。或者直接上ADO.Net

    如果非要使用EF,建议使用EF最新的稳定发布版本(支持DbContext+Code first方式开发)。然后读一下《Programming Entity Framework Code First》和《Programming Entity Framework DbContext》这两本书(目前无中文版)。使用DbContext+Code first POCO+Repository模式,这样既可以保证EF被Repository隔离,又可以保证可测试性,还能在需要更换ORM框架甚至是换成ADO.Net时少改一点代码。

    提供示例代码下载(.Net 4+EF5)

    示例代码中有POCO和EF的Configurations,把EF相关的Configurations单独拿出来保证了DB Model的纯洁性。在这里大体摘一点东西给大家看看

    首先是数据库结构,我使用的是Code first,在第一次有实际的数据库操作的时候会自动生成数据库,生成后的数据库结构如下图:

    clip_image002

    数据库的生成策略在EFContext类的静态构造里面:

    static EFContext()
    {
       // 指定数据库生成策略为不存在时生成
        // 还可以指定为:
        // DropCreateDatabaseAlways(总是删除原有数据库重建)
        // DropCreateDatabaseIfModelChanges(数据库模型改变后删除原有数据库重建)
        Database.SetInitializer<EFContext>(new CreateDatabaseIfNotExists<EFContext>());
    }

    Album表的Configuration设置:

    public class AlbumConfiguration : EntityTypeConfiguration<Album>
    {
        public AlbumConfiguration()
        {
            // 指定数据表名
            ToTable("dbo.Album");
    
            // 设定主键
            HasKey(x => x.Id);
    
            // 设定数据列名及其它属性
            Property(x => x.Id).HasColumnName("Id").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).IsRequired();
            Property(x => x.AlbumName).HasColumnName("AlbumName").IsRequired().HasMaxLength(50);
            Property(x => x.ArtistId).HasColumnName("ArtistId").IsRequired();
    
            // 设置外键约束
            HasRequired(foreignKeyTable => foreignKeyTable.Artist)
                .WithMany(primaryKeyTable => primaryKeyTable.Albums)
                .HasForeignKey(foreignKeyTable => foreignKeyTable.ArtistId);
    
            // 设置多对多关联
            HasMany(thisTable => thisTable.Tags)
                .WithMany(anotherForeignKeyTable => anotherForeignKeyTable.Albums)
                .Map(relationTable => relationTable
                    .MapLeftKey("TagId")
                    .MapRightKey("AlbumId")
                    .ToTable("AlbumTags")
                );
        }
    }

    重写EFContext类中的OnModelCreating函数,使用我们自定义的Configurations:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
    
        // 设定数据库生成配置
        modelBuilder.Configurations.Add(new ArtistConfiguration());
        modelBuilder.Configurations.Add(new AlbumConfiguration());
        modelBuilder.Configurations.Add(new TagConfiguration());
    }

    Repository模式这里我就不多说了,具体看AbstractDbAccessor项目中的内容,EF的Repository实现在ConcreteDbAccessor项目EntityFramework目录下的EFDbAccessor和Repository目录

  • 相关阅读:
    Java实现 LeetCode 69 x的平方根
    Java实现 LeetCode 68 文本左右对齐
    Java实现 LeetCode 68 文本左右对齐
    Java实现 LeetCode 68 文本左右对齐
    Java实现 LeetCode 67 二进制求和
    Java实现 LeetCode 67 二进制求和
    Java实现 LeetCode 67 二进制求和
    Java实现 LeetCode 66 加一
    Java实现 LeetCode 66 加一
    CxSkinButton按钮皮肤类
  • 原文地址:https://www.cnblogs.com/badly1984/p/3203565.html
Copyright © 2011-2022 走看看