C# 为什么我需要添加相同的引用,而此引用是从另一个项目添加的

C# 为什么我需要添加相同的引用,而此引用是从另一个项目添加的,c#,.net,entity-framework,C#,.net,Entity Framework,这里有一个问题,假设我有两个项目: 应用程序(控制台) 数据访问(类库) 在DataAccess项目中,有一个从DbContext继承的DataContext类 public class DataContext : DbContext {...} 在Application project中,我添加了DataAccess引用,在main方法中,我添加了以下语句: using (var context = new DataContext ()){...} 但是雷沙珀秀 类型DbContext在未

这里有一个问题,假设我有两个项目:

  • 应用程序(控制台)
  • 数据访问(类库)
  • 在DataAccess项目中,有一个从DbContext继承的DataContext类

    public class DataContext : DbContext {...}
    
    在Application project中,我添加了DataAccess引用,在main方法中,我添加了以下语句:

    using (var context = new DataContext ()){...}
    
    但是雷沙珀秀

    类型
    DbContext
    在未引用的程序集中定义

    为什么我需要再次添加相同的程序集

    为什么我不能从DataAccess.dll获取DbContext定义

    (DataAccess项目通过NuGet添加了EntityFramwork.dll)


    编辑1:当一个类型继承了另一个类型(例如:DataContext继承自DbContext)时,为什么编译器没有在同一个dll中包含DbContext的定义,所以在另一个项目中,我们只需要添加对子类型的dll的引用?

    ,因为您的类库(
    .dll
    )不“包含”它的依赖程序集。因此,如果要使用类库,执行程序集也需要对依赖程序集进行引用

    (这与配置文件有点相同,它们也不是嵌入的,因此即使您在类库的配置文件中定义了connectionstring,您也需要在启动应用程序中定义它。)

    如果您真的想将库嵌入到单个dll中,您可以查看一下,但建议只在启动应用程序中包含所需的所有库


    另一个好的(我可以推荐)是。您只需通过NuGet安装,无需任何配置,下次构建应用程序时,它会将所有内容嵌入到类库中。

    ,因为您要访问的类型位于该程序集上。 因为您希望能够在该类型上定义变量。就像:

    DataContext dbContext = new DataContext();
    dbContext.Users.ToList();
    
    这就是您希望在表示层中使用DAL执行的操作。但问题是您仍然使用实体框架。 让我们在服务层上创建一个依赖于EntityFramework的函数

    List<User> GetUsers()
    {
    DataContext dbContext = new DataContext();
    dbContext.Users.ToList();
    }
    
    List GetUsers()
    {
    DataContext dbContext=新的DataContext();
    dbContext.Users.ToList();
    }
    
    现在我们可以简单地调用这个服务和函数,而无需添加实体框架引用。那是因为,;在表示层,我们现在与实体框架无关。我们只是调用一个函数。但在您的例子中,您只是将实体框架与另一个项目的上下文一起使用。这就是为什么你的代码需要引用,而我的代码不需要引用。
    Thanx

    所以在C#中,当我向我的项目添加引用时,这并不意味着它将被编译到同一个dll中?当我部署时,应用程序会有重复的dll吗?谢谢!当您部署它时,它将只是带有dll的启动项目。如果你想嵌入dll,我可以向你推荐costura.fody。你唯一要做的就是通过nuget安装,然后就可以开始了