gpt4 book ai didi

c# - 扩展 ApplicationUser 如何从共享项目正确设置关系

转载 作者:行者123 更新时间:2023-11-30 23:15:31 24 4
gpt4 key购买 nike

我正在使用 ASP.NET Identity 2.0。目前我想通过表 UserDetails 扩展 ApplicationUser(将 AspNetUsers 重命名为 Users),例如 FirstName

我的问题是什么?我已经分离了存储 EF 模型的类库项目。我不喜欢生成另一个 EF 模型(如果没有必要的话)。

我在 Users 表和 UserDetails 表之间有 SQL Server 关系,没关系。不幸的是,在 ASP 项目中,Users 表在 IdentityUser 中的某个地方进行了深度硬编码。这意味着我有 ApplicationUser 继承了 IdentityUser

我在 AppDbContext 中尝试的是:

protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);

// Ignore columns
builder.Entity<ApplicationUser>().Ignore(c => c.PhoneNumberConfirmed);

// Rename tables
builder.Entity<ApplicationUser>().ToTable("Users");
builder.Entity<IdentityRole>().ToTable("Roles");
builder.Entity<IdentityRoleClaim<string>>().ToTable("IdentityRoleClaims");
builder.Entity<IdentityUserClaim<string>>().ToTable("IdentityUserClaims");
builder.Entity<IdentityUserLogin<string>>().ToTable("IdentityUserLogins");
builder.Entity<IdentityUserToken<string>>().ToTable("IdentityUserTokens");

// Relationship
builder.Entity<ApplicationUser>()
.HasOne(p => p.UserDetails)
.WithOne(i => i.Users)
.HasForeignKey<Shared.Database.UserDetails>(u => u.UserID);
}

问题在 WithOne(i => i.Users) 的最后一行,i.Users 不是 ApplicationUser。有趣的是 ApplicationUser 具有与 i.Users 相同的属性 :D

所以我只需要知道如何正确转换它就可以建立关系。

有什么解决办法吗?或者有什么建议可以换一种方式吗?

共享项目被 1 个附加项目 (WCF) 使用,所以我不能把它继承自 IdentityUser :/

谢谢你们。

最佳答案

按照我的理解,您想将两个不同的对象映射到同一个数据库表,并将另一个实体 FK 映射到该表。而且你对第一部分没有问题,但对第二部分有问题:

Problem is on last line in WithOne(i => i.Users), i.Users is not ApplicationUser. Funny thing is that ApplicationUser has same properties like i.Users :D

我看到了两个解决方案。

  1. UserDetails 类中删除导航属性,并在两个地方简单地使用 WithOne()
  2. 如果您需要该导航属性,您可以使用类似于 Identity 类结构的方法,如下所示:

假设您当前在共享项目中的 UserDetails 类如下所示:

public class UserDetails
{
public string Id { get; set; }
public string FirstName { get; set; }
// other properties ...
public string UserID { get; set; }
public User User { get; set; } // the problematic navigation property
}

您可以将其转换为泛型类:

public class UserDetails<TUser> where TUser: class
{
public string Id { get; set; }
public string FirstName { get; set; }
// other properties ...
public string UserId { get; set; }
public TUser User { get; set; }
}

并让旧的非泛型类简单地继承它:

public class UserDetails : UserDetails<User> { } 

现在共享项目 EF 模型中的所有内容都应该和以前一样,因此使用它的其他 (WCF) 项目应该不会受到影响。

我想您已经明白了。在 ASP 项目中,您只需创建另一个类:

public class ApplicationUserDetails : UserDetails<ApplicationUser> { }

并将其映射到 UserDetails 表,类似于将 ApplicationUser 映射到 Users 的方式:

builder.Entity<ApplicationUserDetails>().ToTable("UserDetails");

然后将 ApplicationUser 类中的 UserDetails 导航属性更改为:

public ApplicationUserDetails UserDetails { get; set; }

最后建立没有任何问题的关系:

builder.Entity<ApplicationUser>()
.HasOne(u => u.UserDetails)
.WithOne(d => d.User)
.HasForeignKey<ApplicationUserDetails>(d => d.UserID);

关于c# - 扩展 ApplicationUser 如何从共享项目正确设置关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42507836/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com