【发布时间】:2014-12-22 04:44:34
【问题描述】:
我使用这个示例项目 (https://github.com/imranbaloch/ASPNETIdentityWithOnion) 作为我的应用程序架构,在这个示例中,核心完全从包括身份框架在内的基础设施中解构出来。
在这个示例中,作者使用了适配器模式来解耦核心身份类(IdentityUser、IdentityRole ...),并在核心层提供类似的类。
现在这个示例项目中的问题是域模型(产品、图像)没有与模仿身份的虚拟类(AppUser、ApplicationRole、AppliationUserRoles...)链接。
然后我修改了代码,添加了对 AppUser 的引用
public sealed class Image : BaseEntity
{
public Image()
{
Products = new HashSet<Product>();
}
public string Path { get; set; }
public AppUser AppUser { get; set; } // The Added Reference ...
public ICollection<Product> Products { get; set; }
}
如果我将“AppUser”导航属性放在“Image”类中,则创建的数据库将有四个新表,而不是身份框架的默认五个表。
我需要将这些表合并到默认表中。 怎么样?
编辑:
这是驻留在数据层中的身份模型(我无法从核心引用)。
public class ApplicationIdentityUser :
IdentityUser<int, ApplicationIdentityUserLogin, ApplicationIdentityUserRole, ApplicationIdentityUserClaim>, IDomainUser {
public ApplicationIdentityUser()
: base() {
Images = new HashSet<Image>();
}
public string Name { get; set; }
public virtual ICollection<Image> Images { get; set; }
}
public class ApplicationIdentityRole : IdentityRole<int, ApplicationIdentityUserRole>
{
public ApplicationIdentityRole(){}
public ApplicationIdentityRole(string name){Name = name;}
}
public class ApplicationIdentityUserRole : IdentityUserRole<int> {}
public class ApplicationIdentityUserClaim : IdentityUserClaim<int>{}
public class ApplicationIdentityUserLogin : IdentityUserLogin<int>{}
这也是我在 OnModelCreating 方法中的模型构建器:
modelBuilder.Entity<Image>()
.Property(e => e.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<Image>()
.HasMany(e => e.Products)
.WithRequired(e => e.Image)
.WillCascadeOnDelete(false);
modelBuilder.Entity<ApplicationIdentityUser>()
.Property(e => e.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<ApplicationIdentityRole>()
.Property(e => e.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<ApplicationIdentityUserClaim>()
.Property(e => e.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
【问题讨论】:
-
AspNet* 表是多余的。需要摆脱它们。检查您的 ApplicationDbContext 对这些表做了什么?
-
我的 ApplicationDbContext 实际上是从 IdentityDbContext 驱动的,我需要一种方法来存储用户信息,您的意思是我可以使用以 Application* 开头的表吗?
-
我是说应该只有一组 *Users、*UserClaims 等表。看起来您在 ApplicationDbContext 中进行继承的方式已被破坏,并且您没有覆盖
Users和Roles等,因此 EF 为您创建了两组表。检查一下。 -
好的,我会更新我的问题以包含实现细节
-
@trailmax 我已经更新了问题,请检查...
标签: .net entity-framework-6 asp.net-identity onion-architecture