我有两个表,User和UserPhoto,用一对多关系表示。我想要一个具有AddUser / UpdateUser / DeleteUser方法的UserRepository类,以及AddUserPhoto和DeleteUserPhoto,因为有一些逻辑我想实现添加和删除我想要包含在存储库层中的用户照片。
在AddUserPhoto方法中,我从集合中检索User对象,添加照片,将modified设置为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()操作返回的用户的IsValid = False,说“需要位置字段”。
Location是User的一个属性,它是必需的,并引用另一个名为GeographicalLocation的表,因此用户的Location属性应该是一个有效的GeographicalLocation对象。
我已经使用Watch进行了检查,并且用户(返回时)肯定有一个有效的位置分配给Location属性,所以我很困惑,为什么验证失败。
有什么想法吗?
编辑:下面的用户类
[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; }
}
答案 0 :(得分:1)
我会从[Required]
属性中删除Location
数据注释并添加外键:
//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; }
LocationID
位于Users
表中,因此会在没有DbGeographicalAreas
表连接的情况下填充 - 如果您使用Include
如果添加外键,实体框架更容易使用。
参考文献:
Why does Entity Framework Reinsert Existing Objects into My Database?