【发布时间】:2015-08-24 11:33:24
【问题描述】:
在我的 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; }
}
并在我的VCollectAPIContext : DbContext 类中包含属性public DbSet<UserVisit> UserVisits { get; set; }(并使用代码优先迁移更新数据库)。
要在查询用户 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);
}
但是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 的调用中它不为空。所以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' 列”
我应该如何执行在我的控制器方法中插入相关数据项这一看似简单的任务?
【问题讨论】:
-
数据库中的 UserVisit 表是什么样的?我想知道问题是否是移动服务 SqlGenerator 没有运行。您描述的 context.UserVisits.Add() 行为非常奇怪!
-
尝试记录生成的 SQL 语句:msdn.microsoft.com/en-us/data/dn469464.aspx#Log
标签: entity-framework azure-mobile-services