【问题标题】:EF creates a new UserProfile every time I reference one?每次我引用一个用户配置文件时,EF 都会创建一个新的用户配置文件?
【发布时间】:2025-11-28 16:10:01
【问题描述】:

我的问题是以下代码不仅会创建 ProtectedPassword(应该如此),而且还会创建正在插入其中的所有者,即使该所有者已经存在。

UserProfile user = PublicUtility.GetAccount(User.Identity.Name); //gets an existing UserProfile
ProtectedPassword pw = new ProtectedPassword(model.Name, user, model.Password);
ProtectedPassword.Create(pw);

因此,在创建一个新的 ProtectedPassword 后,我最终会引用一个新的 UserProfile(除了一个新 ID 外,其值与前一个相同)。

我已经把这个问题搞砸了几个小时,如果有人可以帮助我,我将不胜感激!

顺便说一句,我首先使用 ASP.NET MVC4 和 EF Code。

首先,实体: 受保护的密码:

    [Table("ProtectedPassword")]
    public class ProtectedPassword : ProtectedProperty
    {

        [Required]
        [MinLength(3)]
        [MaxLength(20)]
        public string Password { get; set; }

        private ProtectedPassword()
        {
        }

        public ProtectedPassword(string name, UserProfile owner, string password)
        {
            Name = name;
            Owner = owner;
            Password = password;
            SubId = PublicUtility.GenerateRandomString(8, 0);
            Type = ProtectedPropertyType.Password;
        }

        public static bool Create(ProtectedPassword pw)
        {
            try
            {
                using (MediaProfitsDb db = new MediaProfitsDb())
                {
                    db.ProtectedPasswords.Add(pw);
                    db.SaveChanges();
                    return true;
                }
            }
            catch
            {
                return false;
            }
        }
}

从 ProtectedProperty 继承:

public class ProtectedProperty
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int PropertyId { get; set; }

        [Required]
        public string SubId { get; set; }

        public int Downloads { get; set; }

        [Required]
        public UserProfile Owner { get; set; }

        [Required]
        public string Name { get; set; }

        [Required]
        public ProtectedPropertyType Type { get; set; }

    }

最后是用户配置文件:

    [Table("UserProfile")]
    public class UserProfile
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int UserId { get; set; }
        [Required]
        public string UserName { get; set; }
        [Required]
        public string AffiliateId { get; set; }
        public UserProfile Referer { get; set; }
        [Required]
        public int Balance { get; private set; }
        [Required]
        [EmailAddress]
        public string PaypalEmail { get; set; }
        public int AllTimeEarnings { get; set; }
}

【问题讨论】:

    标签: c# asp.net-mvc database entity-framework asp.net-mvc-4


    【解决方案1】:

    我认为问题在于密码上的 UserProfile 对象未附加到您用于插入的 DbContext。这让 EF 认为它是一个新对象。

    试试:

    using (MediaProfitsDb db = new MediaProfitsDb())
    {
        db.UserProfiles.Attach(pw.UserProfile);
        db.ProtectedPasswords.Add(pw);
        db.SaveChanges();
        return true;
    }
    

    【讨论】: