C# 创建扩展配置文件时在UserProfile中插入的重复数据
在创建并登录C# 创建扩展配置文件时在UserProfile中插入的重复数据,c#,asp.net-mvc-4,visual-studio-2012,ef-code-first,simplemembership,C#,Asp.net Mvc 4,Visual Studio 2012,Ef Code First,Simplemembership,在创建并登录UserProfile之后,我已成功创建了UserProfile的ExtendedProfile。但是每次我创建一个ExtendedProfile,UserProfile中的用户数据都会用不同的UserId进行复制,我创建的ExtendedProfile会接收复制的UserId 我的实体设计: [Table("UserProfile")] public class UserProfile { [Key] [DatabaseGenerated(DatabaseGener
UserProfile
之后,我已成功创建了UserProfile
的ExtendedProfile
。但是每次我创建一个ExtendedProfile
,UserProfile
中的用户数据都会用不同的UserId
进行复制,我创建的ExtendedProfile
会接收复制的UserId
我的实体设计:
[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 class ExtendedProfile
{
[Required]
[Key]
[ForeignKey("UserProfile"), DatabaseGenerated(DatabaseGeneratedOption.None)]
[HiddenInput(DisplayValue = false)]
public int UserId { get; set; }
[Display(Name = "First name")]
public string FirstName { get; set; }
[Display(Name = "Last name")]
public string LastName { get; set; }
public virtual UserContact UserContact { get; set; }
public virtual UserProfile UserProfile { get; set; }
}
UserContact
public class UserContact
{
[Key]
[Required]
[ForeignKey("ExtendedProfile")]
[HiddenInput(DisplayValue = false)]
public int UserId { get; set; }
[DataType(DataType.PhoneNumber)]
[Display(Name = "Phone:")]
public string Phone { get; set; }
public virtual ExtendedProfile ExtendedProfile { get; set; }
}
创建操作
[HttpGet]
public ActionResult Create()
{
return View();
}
[HttpPost]
public ActionResult Create(CreateExtendedUserViewModel model)
{
if (ModelState.IsValid)
{
try
{
var userId = WebSecurity.GetUserId(System.Web.HttpContext.Current.User.Identity.Name);
var userProfile = _dataSource.UserProfiles.FirstOrDefault(u => u.UserId == userId);
if (userProfile != null)
{
var extendedProfile= new ExtendedProfile
{
UserProfile = userProfile,
FirstName = model.FirstName,
LastName = model.LastName,
UserContact = new UserContact
{
Phone = mode.Phone
}
};
_dataSource.SaveUser(extendedProfile);
return RedirectToAction("About", "Home");
}
}
catch (Exception)
{
ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator.");
throw;
}
}
return View(model);
}
编辑
SaveUser()
我只是不明白为什么它会返回并将数据插入成员表。除非,可能我需要为成员资格表和其他添加的表使用不同的上下文
无论如何,即使我使用开箱即用的
context.ExtendedUsers.Add(user)
和context.SaveChanges()代码>在我的控制器中,同样的情况也会发生。我开始认为这与IoC(Ninject)有关,因为我制作了一个没有IoC的演示应用程序,一切都很好。首先,我认为您应该选择SingleOrDefault(),因为您希望得到一个或零个结果;接下来,如果在ExtendedProfile而不是对象上设置UserProfileId,会怎么样?您确定已正确检索userProfile吗?@L-Three更改为SingleOrDefault()
,运气不好。我有UserId
该对象是导航属性的一部分。我确信在将相同的数据发送回数据库进行复制时,已正确检索userProfile。SaveUser的代码是什么样子的?另外,在保存之前,您需要将UserContact.UserId和ExtendedProvile.UserId设置为UserId的值。@KevinJunghans我添加了更多信息。@KevinJunghans从逻辑上讲,我不需要提及UserId
UserProfile=UserProfile
就足够了,至于UserContact
,我正在扩展程序实例
中创建一个新实例,这是为我的UserContact设置UserId的一个好方法。我已经对此进行了测试,它可以工作……troble是当用户配置文件数据被发送回数据库并复制时
public void SaveUser(ExtendedUser user)
{
using (var context = new EFContextDb())
{
if (user.UserId== 0)
{
context.ExtendedUsers.Add(user);
}
else if (user.UserId> 0)
{
var currentUser = context.ExtendedUsers
.Include(c => c.UserContact)
.Single(t => t.UserId== player.UserId);
context.Entry(currentUser).CurrentValues.SetValues(user);
currentUser.UserContact = user.UserContact;
}
context.SaveChanges();
}
}