CSharp - 有效的知识库验证因未知原因失败

  显示原文与译文双语对照的内容

我有两个表,用户和 UserPhoto,它们用One-to-Many关系表示。 我们希望拥有一个具有 AddUser/UpdateUser/DeleteUser 方法和AddUserPhoto和 DeleteUserPhoto,因为我希望实现包含在知识库层中的用户照片的添加和删除。

在AddUserPhoto方法中,我从集合中检索用户对象,添加照片,设置为 true 并返回验证结果。 如下


public bool AddUserPhoto(DbUserPhoto photo, object userId)
 {
 try
 {
 var dbItem = Context.Users.Find(userId);
 if (dbItem == null) 
 throw new Exception(string.Format("User id {0} not found"
, userId));

//Some logic around ordering of photos and only having 
//one primary photo
 if (photo.IsPrimary)
 {
 foreach (var p in dbItem.Photos)
 {
 p.IsPrimary = false;
 p.DisplayOrder++;
 }

 photo.DisplayOrder = 1;
 }
 else
 {
 var maxDisplayOrder = dbItem.Photos
. Max(p => p.DisplayOrder);
 photo.DisplayOrder = maxDisplayOrder + 1;
 }

 dbItem.Photos.Add(photo);
 Context.Users.Attach(dbItem);
 Context.Entry(dbItem).State = EntityState.Modified;
 return Context.Entry(dbItem).GetValidationResult().IsValid;
 }
 catch (Exception ex)
 {
 if (ex.InnerException!= null)
 throw new DataRepositoryException(ex.InnerException.Message,
"UserDataRepository.InsertItem", 
 ex.InnerException);

 throw new DataRepositoryException(ex.Message,
"UserDataRepository.InsertItem", 
 ex);
 }
 }

我的问题是,验证为用户实体返回了 IsValid = false 。 当从数据库检索到它时,一个用户从 Find() 操作返回的用户名 false =,表示"需要位置字段"。

位置是用户的属性,它是强制的并引用另一个表 GeographicalLocation,因此用户的位置属性应该是有效的GeographicalLocation对象。

我已经检查过使用表,用户( 返回时) 确定有一个指定给位置属性的有效位置,因为它是失败的。

有什么想法?

编辑:下面的用户类


[Table("User")]
 public class DbUser : IEntityComparable<DbUser>
 {
 [Key]
 [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
 public int UserId { get; set; }

 [Required]
 [MaxLength(80)]
 public string FirstName { get; set; }

 [Required]
 [MaxLength(80)]
 public string LastName { get; set; }

 [Required]
 [MaxLength(80)]
 public string EmailAddress { get; set; }

 [Required]
 public DateTime DateOfBirth { get; set; }

 [Required]
 [MaxLength(1)]
 public string Gender { get; set; }

 [Required]
 public virtual DbGeographicalArea Location { get; set; }

}

时间: 作者:

我将从 Location 属性中移除 [Required] 数据批注并添加一个外键:


//You don't need a [Required] annotation on an int because it isn't nullable
public int LocationID {get; set;}

public virtual DbGeographicalArea Location { get; set; }

LocationIDUsers 表中,因这里它将被填充到 DbGeographicalAreas 表中,如果使用 Include,将会发生什么事情。

如果添加外键,Entity Framework 要容易得多。

参考:

为什么 Entity Framework 将现有对象重新插入到数据库中

使用缺少的外键进行处理。

作者:
...