有没有办法在MVC 4中删除对Entity Framework的默认依赖?

Man*_*zas 6 entity-framework dapper asp.net-mvc-4

有没有办法在ASP.NET MVC 4项目中删除对Entity Framework的默认依赖,并将其替换为其他类似技术,如Dapper

Fan*_*rns 13

如果您创建一个新的ASP.NET MVC 4 Web应用程序并选择"Internet Application"作为项目模板,您将注意到实体框架被引用并用作SimpleMembership的一部分.但是,实体框架只有很小的依赖性,可能不值得删除它.

实体框架似乎仅用于2个小任务

使用Entity Framework的第一种方法是创建存储成员资格数据所需的数据库模式.数据库模式创建不是Dapper将为您执行的操作,如果您删除实体框架,则必须手动管理对成员模型/数据库的更改.

使用Entity Framework的第二种方法是在默认的"AccountController"中名为"ExternalLoginConfirmation"的单个方法中,作为其OAuth集成的一部分.它用于注册已从外部提供商(如Facebook)进行身份验证的新用户.

我们可以说SimpleMembership使用SQL命令而不是实体框架[1].

因为SimpleMembership使用SQL命令而不是实体框架,所以它应该与用于此任务的类似Dapper解决方案一样快.此外,SimpleMembership的这种配置已经过微软和社区的广泛测试.出于这些原因,我会不管它.处理安全问题的代码应留给经过认证的安全专家[2].

如何从新的ASP.NET MVC 4 Web应用程序中删除实体框架

如果你真的想要,依赖很容易删除(我假设您的会员数据库已经创建并正常工作).

=====> 第1步

在Visual Studio解决方案资源管理器中打开"引用"文件夹.

右键单击"EntityFramework"并选择"删除".

=====> 第2步

打开过滤器/ InitializeSimpleMembershipAttribute.cs

删除以下内容:

using System.Data.Entity.Infrastructure;
Run Code Online (Sandbox Code Playgroud)

Database.SetInitializer<UsersContext>( null );
Run Code Online (Sandbox Code Playgroud)

using ( var context = new UsersContext() ) {
    if ( !context.Database.Exists() ) {
        // Create the SimpleMembership database without Entity Framework migration schema
        ( ( IObjectContextAdapter ) context ).ObjectContext.CreateDatabase();
    }
}
Run Code Online (Sandbox Code Playgroud)

=====> 第3步

打开:Models/AccountModels.cs

删除以下内容:

public class UsersContext : DbContext {
    public UsersContext()
        : base( "DefaultConnection" ) {
    }

    public DbSet<UserProfile> UserProfiles {
        get;
        set;
    }
}
Run Code Online (Sandbox Code Playgroud)

=====> 第4步

打开:Controllers/AccountController.cs

查找名为"ExternalLoginConfirmation"的方法.

替换以下内容:

using ( UsersContext db = new UsersContext() ) {
    UserProfile user = db.UserProfiles.FirstOrDefault( u => u.UserName.ToLower() == model.UserName.ToLower() );
    // Check if user already exists
    if ( user == null ) {
        // Insert name into the profile table
        db.UserProfiles.Add( new UserProfile {
            UserName = model.UserName
        } );
        db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

使用简洁的等效代码 - 代码注释告诉您需要实现的内容.

如果您不使用OAuth,则应该能够完全删除此方法和其他方法.

Et Voila;)

[1]"一切都是作为SQL调用实现的,而不是需要存储过程,视图,代理和更改通知."
Jon Galloway,微软

[2]"让我告诉你关于滚动自己的加密算法和安全系统的所有标准警告:不要.创建几乎但不太安全的安全系统是非常非常容易的.一个安全系统可以提供给你一种虚假的安全感比没有任何安全系统更糟糕!"
传奇人物Eric Lippert