gpt4 book ai didi

c# - 如何将 SimpleMembership UserProfile 链接到具有外键的扩展配置文件?

转载 作者:太空宇宙 更新时间:2023-11-03 16:17:56 25 4
gpt4 key购买 nike

关于如何使这段代码以我想要的方式工作,我已经没有想法了。我有 3 个模型,如下所述。

UserProfile 和 Player 一对一关系

首先创建用户配置文件,在注册时将电子邮件确认发送到用户提供的电子邮件。一旦他们确认了他们的帐户,他们将被重定向到他们的第一个登录页面,如果通过身份验证,他们将被重定向到创建新玩家页面以提供有关他们扩展配置文件的更多信息。在创建页面上,我希望已登录用户的 UserId 与即将创建的播放器相同。当我按原样尝试代码时,没有任何响应,也没有向数据库添加或保存任何内容。

Team and Player 一对多关系

几乎不言自明,一名球员必须属于一支球队。这使得重定向到编辑操作成为不可能,因为 Player.TeamId != null

用户资料

[Table("UserProfile")]
public class UserProfile
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }

public string UserName { get; set; }

public string Email { get; set; }

public virtual Player Player { get; set; }
}

团队

    public class Team
{
[Key]
[HiddenInput(DisplayValue = false)]
public int TeamId { get; set; }

[Display(Name = "Full Name:")]
public string Name { get; set; }

public virtual ICollection<Player> Players { get; set; }
}

播放器

public class Player
{
[Key]
[ForeignKey("UserProfile")]
[HiddenInput(DisplayValue = false)]
public int UserId { get; set; }

[Required]
[Display(Name = "Full name")]
public string FullName{ get; set; }

[Display(Name = "Team")]
public int TeamId { get; set; }

public virtual Team Team { get; set; }

public virtual UserProfile UserProfile { get; set; }
}

保存播放器

public void SavePlayer(Player player)
{
using (var context = new EFootballDb())
{
if (player.UserId == 0)
{
context.Players.Add(player);
}
else if (player.UserId > 0)
{
var currentPlayer = context.Players
.Single(t => t.UserId == player.UserId);

context.Entry(currentPlayer).CurrentValues.SetValues(player);
}
context.SaveChanges();
}
}

创建 Action

[HttpGet]
public ActionResult Create()
{
PopulateTeamsDropDownList();
return View();
}

[HttpPost]
public ActionResult Create(Player model)
{
try
{
if (ModelState.IsValid)
{
_dataSource.SavePlayer(model);
return RedirectToAction("Detail", "Team", new { id = model.TeamId });
}
}
catch (Exception)
{
ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator.");
}
PopulateTeamsDropDownList(model.TeamId);
return View(model);
}


private void PopulateTeamsDropDownList(object selectedTeams = null)
{
var teamsQuery = from d in _dataSource.Teams
orderby d.Name
select d;
ViewBag.TeamID = new SelectList(teamsQuery, "TeamId", "Name", selectedTeams);
}

Team 和 Player 之间一切正常,但我无法在创建时将 UserProfile 和 Player 链接起来。有没有人有我应该尝试的想法或不同的方法?提前致谢!

最佳答案

更新:我正在添加另一种方法来执行此操作。这是一种非常复杂的方式,它可以工作,但最终你不会想要这个。

这是一种痛苦。我也花了很多时间弄清楚这一点。我找到的最接近的在线资源是 here .

注意该页面上有两个错误。1)使用添加迁移而不是创建迁移2) 更新 UsersContext 时确保包含 DbSet 的通用类型。 IE。

public DbSet<Membership> Membership { get; set; }

按照该链接上的步骤操作。然后你需要多做一点。

对于我的解决方案,我将所有模型移至模型类库并将 UsersContext 移至 DAL 类库,但这不是必需的。

完成迁移后,您可以添加一个基本类以链接到 UserProfile,就像这样......

public class User
{
public int UserId { get; set; }

public string FirstName { get; set; }

public int UserProfileId { get; set; }

[ForeignKey("UserProfileId")]
public UserProfile UserProfile { get; set; }
}

不要忘记更新 UsersContext。注意:您可以将 UsersContext 重命名为您喜欢的任何名称。

public DbSet<User> Users { get; set; }

最后一步是添加一个在您的 AccountController 中调用的类来代替 WebSecurity.CreateUserAndAccount(...)

public class CustomSimpleMembershipProvider
{
private readonly UsersContext _db = new UsersContext();

public bool CreateUser(string username, string password, string firstName)
{
var userCreated = false;

WebSecurity.CreateUserAndAccount(username, password);

var userProfile = _db.UserProfiles.FirstOrDefault(u => u.UserName == username);

// Check if user already exists
if (userProfile != null)
{
var member = new Model.User { FirstName = firstName, UserProfile = userProfile };

try
{
_db.Users.Add(member);
_db.SaveChanges();

userCreated = true;
}
catch (Exception)
{
//Add logging or throw whatever exceptions needed
throw;
}

}
return userCreated;
}
}

迁移的原因是它允许您在自己的上下文中控制成员表。我曾尝试在不同的上下文中创建它们,但没有成功。我希望这能满足您的需求。

关于c# - 如何将 SimpleMembership UserProfile 链接到具有外键的扩展配置文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15124354/

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