在我的 Azure 移动服务中,我有一个控制器类UserController : TableController<User>
其中有一个 get 方法:
// GET tables/User/48D68C86-6EA6-4C25-AA33-223FC9A27959
public SingleResult<User> GetUser(string id)
{
return Lookup(id);
}
我想记录每次访问用户的时间,因此我向模型添加了一个简单的类型:
public class UserVisit : Microsoft.WindowsAzure.Mobile.Service.EntityData
{
public string VisitingUser { get; set; }
public DateTime TimeOfVisit { get; set; }
}
并包括财产public DbSet<UserVisit> UserVisits { get; set; }
in my VCollectAPIContext : DbContext
类(并通过代码优先迁移更新数据库)。
要在查询用户 ID 时将 UserVisit 添加到数据库,我将控制器方法更改为
// GET tables/User/48D68C86-6EA6-4C25-AA33-223FC9A27959
public async Task<SingleResult<User>> GetUser(string id)
{
var userVisit = new UserVisit { VisitingUser = id, TimeOfVisit = DateTime.UtcNow };
context.UserVisits.Add(userVisit);
await context.SaveChangesAsync();
return Lookup(id);
}
But the SaveChangesAsync
失败并带有System.Data.Entity.Validation.DbEntityValidationException
。挖掘例外情况EntityValidationErrors
属性我发现问题是“Id 字段是必需的”。
这有点奇怪。 Id 字段是基类中的属性之一Microsoft.WindowsAzure.Mobile.Service.EntityData
我希望在插入时自动添加。无论如何,我可以添加它和其他几个基类的属性:
// GET tables/User/48D68C86-6EA6-4C25-AA33-223FC9A27959
public async Task<SingleResult<User>> GetUser(string id)
{
var userVisit = new UserVisit { Id = Guid.NewGuid().ToString(), Deleted = false, VisitingUser = id, TimeOfVisit = DateTime.UtcNow, CreatedAt = DateTimeOffset.Now };
context.UserVisits.Add(userVisit);
await context.SaveChangesAsync();
return Lookup(id);
}
这次我得到一个System.Data.Entity.Infrastructure.DbUpdateException
因为我们“无法将 NULL 值插入列‘CreatedAt’”。调用中它不为空Add
. So CreatedAt
在我的代码之外的某个地方被设置为 null,然后插入失败!
我也尝试设置一个EntityDomainManager<UserVisit> userVisitDomainManager;
控制器初始化程序中的实例变量,然后将我的控制器 get 方法重写为
// GET tables/User/48D68C86-6EA6-4C25-AA33-223FC9A27959
public async Task<SingleResult<User>> GetUser(string id)
{
var userVisit = new UserVisit { VisitingUser = id, TimeOfVisit = DateTime.UtcNow };
await userVisitDomainManager.InsertAsync(userVisit);
return Lookup(id);
}
失败并显示相同的消息“无法将 NULL 值插入列‘CreatedAt’”
我应该如何执行在控制器方法中插入相关数据项这一看似简单的任务?