Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 在Azure移动服务控制器中添加相关数据库条目_Entity Framework_Azure Mobile Services - Fatal编程技术网

Entity framework 在Azure移动服务控制器中添加相关数据库条目

Entity framework 在Azure移动服务控制器中添加相关数据库条目,entity-framework,azure-mobile-services,Entity Framework,Azure Mobile Services,在我的Azure移动服务中,我有一个控制器类UserController:TableController,其中有一个get方法: //获取表格/User/48D68C86-6EA6-4C25-AA33-223FC9A27959 公共SingleResult GetUser(字符串id) { 返回查找(id); } 我想记录每次访问用户的情况,因此我向模型中添加了一个简单类型: 公共类用户访问:Microsoft.WindowsAzure.Mobile.Service.EntityData {

在我的Azure移动服务中,我有一个控制器类
UserController:TableController
,其中有一个get方法:

//获取表格/User/48D68C86-6EA6-4C25-AA33-223FC9A27959
公共SingleResult GetUser(字符串id)
{
返回查找(id);
}
我想记录每次访问用户的情况,因此我向模型中添加了一个简单类型:

公共类用户访问:Microsoft.WindowsAzure.Mobile.Service.EntityData
{
公共字符串访问用户{get;set;}
公共日期时间访问时间{get;set;}
}
并将属性
public DbSet uservisions{get;set;}
包含在my
VCollectAPIContext:DbContext
类中(并使用代码优先迁移更新数据库)

要在查询用户id时向数据库添加用户访问,我将控制器方法更改为

//获取表格/User/48D68C86-6EA6-4C25-AA33-223FC9A27959
公共异步任务GetUser(字符串id)
{
var userVisit=newuservisit{VisitingUser=id,TimeOfVisit=DateTime.UtcNow};
context.uservisions.Add(userVisit);
wait context.saveChangesSync();
返回查找(id);
}
但是
savechangessync
失败,出现
System.Data.Entity.Validation.DbEntityValidationException
。在异常的
EntityValidationErrors
属性中,我发现问题是“Id字段是必需的”

这有点奇怪。Id字段是Microsoft.WindowsAzure.Mobile.Service.EntityData基类
中的属性之一,我希望在插入时自动添加该属性。不管怎样,我可以添加它和其他几个基类的属性,因此:

//获取表格/User/48D68C86-6EA6-4C25-AA33-223FC9A27959
公共异步任务GetUser(字符串id)
{
var userVisit=newuservisit{Id=Guid.NewGuid().ToString(),Deleted=false,VisitingUser=Id,TimeOfVisit=DateTime.UtcNow,CreatedAt=DateTimeOffset.Now};
context.uservisions.Add(userVisit);
wait context.saveChangesSync();
返回查找(id);
}
这次我得到了一个
System.Data.Entity.Infrastructure.DbUpdateException
,因为我们“无法将值NULL插入到'CreatedAt'列中”。在调用
Add
时,它不是null。因此,
CreatedAt
在我的代码之外的某个地方被设置为null,然后插入失败

我还尝试设置一个
EntityDomainManager用户访问MainManager控制器初始值设定项中的实例变量,然后将我的控制器get方法重写为

//获取表格/User/48D68C86-6EA6-4C25-AA33-223FC9A27959
公共异步任务GetUser(字符串id)
{
var userVisit=newuservisit{VisitingUser=id,TimeOfVisit=DateTime.UtcNow};
等待userVisitDomainManager.InsertAsync(userVisit);
返回查找(id);
}
该操作失败,并显示相同的消息“无法将值NULL插入列'CreatedAt'”


我应该如何执行在控制器方法中插入相关数据项的看似简单的任务?

解决方案可能类似于。我猜您的迁移没有使用移动服务SqlGenerator,因此一些自定义SQL设置没有得到应用。这意味着:

  • Id没有获得NEWID()的默认值——这解释了“Id字段是必需的”错误
  • CreatedAt没有获得SYSUTCDATETIME()的默认值——这与EntityData.CreatedAt上的[DatabaseGenerated]属性相结合,解释了“NULL CreatedAt”错误
尝试根据上面的链接更新您的迁移,看看是否适合您。

要解决“需要Id字段”的问题,请遵循的说明

将此项添加到您的模型中:

[Key]
[数据库生成(DatabaseGeneratedOption.Identity)]
[TableColumn(TableColumnType.Id)]
公共新字符串Id{get;set;}

添加实体时,它将自动生成GUID。

数据库中的UserVisit表是什么样子的?我想知道问题是否在于移动服务SqlGenerator没有运行。不过,您描述的context.uservisions.Add()的行为非常奇怪!尝试记录生成的SQL语句:谢谢Brett-我会尝试的。如何强制迁移使用移动服务SqlGenerator?请查看我上面回答中的链接——它显示了以下内容:
SetSqlGenerator(“System.Data.SqlClient”,new EntityTableSqlGenerator())我还没有机会检查这一点,因为我陷入了需要浏览的其他服务器错误中,但无论如何我都会在悬赏过期之前奖励它,因为这看起来很有希望。仅供参考,我们现在在这里记录了这一点:现在,当试图保存一个新用户访问数据库时,我得到了一个看起来错误的
System.Data.Entity.Validation.DbEntityValidationException
。正如问题中提到的,我的模型类继承自提供
Id
属性(以及其他内容)的模型类。当然这会生成GUID?我同意,但当我使用SetSqlGenerator(“System.Data.SqlClient”,new EntityTableSqlGenerator())完成初始迁移时,它不会在测试中生成GUID;谢谢多米尼克,这很有用。我认为当我因为SDK方法失败而重写它们时,是时候质疑SDK的使用了。我目前正在探索用ASP.Net API 2重写服务器端代码,使用实体框架,但不使用Azure移动服务。用于移动电话的Azure SDK工作得很好,但我甚至没有在我的示例中使用Azure,只是在我的自托管API中使用表控制器。也许这个SDK应该被命名为其他的东西,因为它非常有用。这真的很有趣-我将检查它,以减少我们在EF中编写的代码量