2014-05-03 79 views
35

我试图标识模型移动到使用这个链接的方法的类库:移动ASP.NET识别模型类库

ASP.NET Identity in Services library

问题1:这似乎继续使用网站项目的连接字符串。我通过在类库中指定完整的连接字符串来克服它。我可以使IdentityDbContext使用类库的连接字符串吗?

问题2:由于问题1,如果我从网站项目中删除实体框架。它会给出以下错误,它正在寻找EF的SqlClient在Website项目中。

“System.InvalidOperationException”类型的异常出现在EntityFramework.dll但在用户代码中没有处理

其它信息:没有实体框架提供发现与不变的名称ADO.NET提供程序“系统.Data.SqlClient”。确保提供程序在应用程序配置文件的'entityFramework'部分中注册。有关更多信息,请参阅http://go.microsoft.com/fwlink/?LinkId=260882

只要在网站项目中省略所有数据访问层引用(如EF),欢迎使用其他解决方案。

+0

也许这会有所帮助。 http://stackoverflow.com/a/29519572/1467014。我唯一要做的就是在控制器中删除几个ef引用。然后,除非我错过了一些东西,否则我的web项目中没有其他ef依赖项。 – puddleglum

回答

1

通过将Identity移动到类库中是什么意思?用作参考?我有我的自定义用户管理器和用户在一个单独的图书馆,但多数民众赞成在所有。

身份的东西需要某种数据存储。如果您将Identity配置为使用EF,请确保为其获取其他Nuget包,并且您应该能够在创建上下文时传递连接字符串。

关闭我的头顶......

var mgr = new UserManager<ApplicationUser>(
    new IUserStore_ofYourChoice<ApplicationUser>(
     new DbContextName("ConnectionStringOverload")); 

我觉得EF店 “UserStore”,总得验证。

现在有几十个不同的nuget包用于数据存储。您不必使用EF,但它需要某种类型的商店。

**编辑**

此外,作为参考,将经常使用的配置,因此其定义的连接字符串,默认情况下,主体工程的,这就是它的假设是如何工作的,因此多数民众赞成确定。

+0

我已经说过,在我的问题(问题1),我把完整的连接字符串的Identitycontext。 我进一步发现,如果我使用DB第一种方法,我不能重写上下文连接字符串。即使我可以做所有的操作来在班级图书馆创建/管理模型。当运行时,它会有错误,说不能在web.config文件中找到连接字符串。确定它不在asp.net项目中,它假设在类库app.config中。 –

+0

使用DataSet设计器时它没有问题,它可以在类库中完全拆分DAL。然后通过没有任何连接字符串的asp.net项目使用。 –

58

要移动IdentityModel到类库(这是根据SRP做正确的事),请按照下列步骤操作:

  1. 创建一个类图书馆。 (ClassLibrary1)
  2. 使用NuGet,添加对Microsoft.AspNet.Identity.EntityFramework的引用。这也会自动添加一些其他参考。
  3. 在您的网站添加一个参考到ClassLibrary1
  4. 查找WebSite/Models/IdentityModel.cs并将其移动到ClassLibrary1。
  5. 让IdentityModel.cs是这样的:

    public class ApplicationUser : IdentityUser 
    { 
    } 
    
    public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
    { 
        public ApplicationDbContext() 
         : base("YourContextName") 
        { 
        } 
    } 
    
  6. 确保你的网站的Web.config已经YourContextName指着部分正确的数据库。 (注意:这个数据库可以并且应该存放你的应用程序数据)。

    <add name="YourContextName" connectionString="YourConnectionStringGoesHere" 
        providerName="System.Data.SqlClient" /> 
    
  7. 让您ApplicationDbContext您的EF上下文类继承:

    public class YourContextName : ApplicationDbContext 
    { 
        public DbSet<ABizClass1> BizClass1 { get; set; } 
        public DbSet<ABizClass2> BizClass2 { get; set; } 
        // And so forth ... 
    } 
    

如果有人在你的网站试图身份系统将路由他们登录或注册,你的数据库全部包含身份表的数据。

不错!

+5

我也建议将ApplicationDbContext分解到IdentityModels文件外部的数据项目中的自己的文件中 –

+0

我试图完成此任务,并且找不到使用ASP时使用Models/Data/Services/Presentation的好方法。网络身份框架。我不需要将我的数据访问层(实体框架)加载到我的核心程序集中以创建我的模型。 – Sam

+0

@Sam,将你的模型移动到一个单独的程序集(其他模型已经在这里了吧?)。然后从那里引用它们。 –

-6

请看看我上传到Github的项目。 https://github.com/giorgos07/AspNet.Identity.AdoNetProvider它包含2个项目:一个具有ASP.NET身份(使用ADO.NET)实现作为单独项目的实现的类库和演示如何使用Identity的ASP.NET MVC应用程序。我希望它能帮助你。

+10

没有这样的存储库。 – user764754

+0

https://github.com/giorgos07/Daarto –

1

有几条规则你必须认识和记住。

首先,Web项目将始终只使用它在自己的项目期间找到的web.config文件。无论您将解决方案中的其他任何其他配置文件放在什么位置,都无关紧要。 Web项目只能使用它在自己的项目中找到的内容。如果在另一个项目中有连接字符串,则必须将其复制到Web项目中,否则将永远找不到。其次,假设Web项目是您的启动项目,并假设您正在使用数据迁移(因为Identity使用它),请注意,包管理器将始终使用它在启动项目中找到的连接字符串。因此,update-database的包管理器将不会在模型项目中使用连接字符串。

简单的解决方案是: 1.将您的连接字符串从模型项目复制到您的Web项目。 2.在包管理器控制台中,确保选择上下文的下拉列表指向您的模型项目。

4

更新@ Rap对EF6和Identity 2的回答。0:

  1. 创建一个类库。 (ClassLibrary1)
  2. 使用NuGet,添加对Microsoft.AspNet.Identity.EntityFramework和Microsoft.AspNet.Identity.Owin的引用。
  3. 在您的网站添加一个参考到ClassLibrary1
  4. 查找WebSite/Models/IdentityModel.cs并将其移动到ClassLibrary1。
  5. IdentityModel.cs应该是这样的,没有必要改变什么:

    public class ApplicationUser : IdentityUser 
    { 
        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager, string authenticationType) 
        { 
         // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType 
         var userIdentity = await manager.CreateIdentityAsync(this, authenticationType); 
         // Add custom user claims here 
         return userIdentity; 
        } 
    } 
    
    public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
    { 
        public ApplicationDbContext() 
         : base("DefaultConnection", throwIfV1Schema: false) 
        { 
        } 
    
        public static ApplicationDbContext Create() 
        { 
         return new ApplicationDbContext(); 
        } 
    } 
    
  6. 确保你的网站的Web.config有一个上下文指着部分正确的数据库。 (注意:这个数据库可以并且应该存放你的应用程序数据)。

    <connectionStrings> 
        <add name="DefaultConnection" connectionString="Data Source=localhost;Initial Catalog=Project;Integrated Security=sspi;Pooling=false;" providerName="System.Data.SqlClient" /> 
    </connectionStrings> 
    
  7. 从ApplicationDbContext让您的EF上下文类继承:

    public class YourContextName : ApplicationDbContext 
    { 
        public DbSet<ABizClass1> BizClass1 { get; set; } 
        public DbSet<ABizClass2> BizClass2 { get; set; } 
        // And so forth ... 
    } 
    
+0

如何解决EF中DbContext类自动生成的问题?有必要修改tt模板? – freedeveloper

+0

@freedeveloper我不明白你的问题?上述的工作。 – Ogglas

+0

感谢您的回答。问题在于EF中的DbContext是由模板自动生成的。如果我修改数据库,那么这个类会再次生成,并且我的更改会丢失。 EF中的模型首先是数据库 – freedeveloper