Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 使用EF4.3的MVC3和依赖性注入问题_Asp.net Mvc 3_Entity Framework_Dependency Injection - Fatal编程技术网

Asp.net mvc 3 使用EF4.3的MVC3和依赖性注入问题

Asp.net mvc 3 使用EF4.3的MVC3和依赖性注入问题,asp.net-mvc-3,entity-framework,dependency-injection,Asp.net Mvc 3,Entity Framework,Dependency Injection,我最近一直在学习使用实体框架4.3和依赖注入的MVC3,以便以后可以实现单元测试。我现在正在尝试实现我在各种示例中看到的一些功能,但是我遇到了一些似乎源于我使用依赖性注入的问题,因此我希望有人指出我的错误之处 我的第一个问题很简单;在我看到的大多数MVC3示例中,对数据库的访问都是在控制器中完成的,但是当使用依赖注入时,我似乎需要将这些代码重构到实现的存储库中。这是否正常和正确 我的第二个更深入的问题是处理这个简单的例子: 我的repository类中有这个方法,它几乎是从一个在线示例()复制而

我最近一直在学习使用实体框架4.3和依赖注入的MVC3,以便以后可以实现单元测试。我现在正在尝试实现我在各种示例中看到的一些功能,但是我遇到了一些似乎源于我使用依赖性注入的问题,因此我希望有人指出我的错误之处

我的第一个问题很简单;在我看到的大多数MVC3示例中,对数据库的访问都是在控制器中完成的,但是当使用依赖注入时,我似乎需要将这些代码重构到实现的存储库中。这是否正常和正确

我的第二个更深入的问题是处理这个简单的例子:

我的repository类中有这个方法,它几乎是从一个在线示例()复制而来的。但是,我得到了一个关于
Include
部分的错误,intellisense确实说变量需要是字符串。我尝试了我前面提到的链接中的原始代码,效果很好,项目之间唯一的主要区别是我使用的是依赖注入

public ExampleUser GetStruContractUser(int id)
{
    ExampleUser user = context.ExampleUsers
        .Include(i => i.ExampleRoles)
        .Where(i => i.UserID == id)
        .Single();

    return user;
}
Include
参数更改为以下值可以正常工作

public ExampleUser GetStruContractUser(int id)
{
    ExampleUser user = context.ExampleUsers
        .Include("ExampleRoles")
        .Where(i => i.UserID == id)
        .Single();

    return user;
}
作为参考,这是我正在使用的DbContext类:

public class EFDbContext : DbContext
{
    public DbSet<ExampleUser> ExampleUsers { get; set; }
    public DbSet<ExampleRole> ExampleRoles { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        modelBuilder.Entity<ExampleUser>().ToTable("User", "MySchema");
        modelBuilder.Entity<ExampleRole>().ToTable("Role", "MySchema");

        modelBuilder.Entity<ExampleUser>()
            .HasMany(m => m.ExampleRoles)
            .WithMany(t => t.ExampleUsers)
            .Map(a =>
            {
                a.MapLeftKey("UserID");  // your PK column name in user table
                a.MapRightKey("RoleID"); // your PK column name in role table
                a.ToTable("UserRole", "MySchema");  // your join table name
            });
        }
    }
公共类EFDbContext:DbContext
{
公共数据库集ExampleUsers{get;set;}
公共数据库集示例角色{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove();
modelBuilder.Entity().ToTable(“用户”、“MySchema”);
modelBuilder.Entity().ToTable(“角色”、“MySchema”);
modelBuilder.Entity()
.HasMany(m=>m.example角色)
.WithMany(t=>t.example用户)
.Map(a=>
{
a、 MapLeftKey(“UserID”);//用户表中的PK列名
a、 MapRightKey(“RoleID”);//角色表中的PK列名
a、 ToTable(“UserRole”、“MySchema”);//您的联接表名称
});
}
}
这是由于我使用依赖性注射造成的还是我误解了其他原因

如果您需要更多信息,请询问,我会尽力提供


非常感谢。

问题1: 使用DI并不强迫您使用存储库模式,事实上它们并不相关。这是一种很好的方法,可以避免将控制器类与数据库上下文类紧密耦合,从而能够更轻松地测试这些类。Repository使您能够隐藏如何访问数据库的实现细节,并允许您在发生这种情况时切换ORM:s(它永远不会这样做)。存储库依赖于您为DbContext提供接口,使用DI也是如此

不过,您要做的是通过接口使用DB,并且在使用DI时,您可以将对DbContext类的引用注入控制器的构造函数中,并让DI控制器为您完成工作

将定义存储库的接口传递给控制器比传递定义DbContext的接口更可取的原因是,为后者创建接口很容易变得过于复杂,而坚持使用存储库要简单得多。不过,为了简单起见,我首先直接使用DbContext,然后从那里扩展

问题2:

Include需要将表名作为字符串包含。因此,后面使用Include是正确的,而前面使用Include则不是


如果我没记错的话,您可以这样做:“.Include(I=>I.ExampleRoles.Name)”来实现同样的效果。

是的,提取数据库层(存储库/上下文),然后将其注入到业务层(控制器)是非常正常的,也是证明应用程序未来的一个好方法。如果您想将数据库ORM从实体框架更改为其他框架,该怎么办?让它与你的控制器紧密结合会让你头疼不已

您的第二个问题是
include
,与依赖性注入无关

数据库集
上包含
,在
系统.Data.Entity
中使用lambdas作为扩展名。如果您想使用它,您需要包括该引用