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

2024-04-07

在我的 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’”

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


解决方案可能类似于这个答案 https://stackoverflow.com/a/32214696/3516125。我猜测您的迁移未使用移动服务 SqlGenerator,因此某些自定义 SQL 设置未应用。这意味着:

  • Id 没有获得 NEWID() 的默认值 - 这解释了您的“Id 字段是必需的”错误。
  • CreatedAt 没有获得 SYSUTCDATETIME() 的默认值——这与 EntityData.CreatedAt 上的 [DatabaseGenerate] 属性相结合,解释了“NULL CreatedAt”错误。

尝试根据上面的链接更新您的迁移,看看这是否适合您。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Azure 移动服务控制器中添加相关数据库条目 的相关文章

  • SQL Server 将 SP_EXECUTESQL 识别为对象而不是过程名称

    我在用DBContext Database SqlQuery
  • 处理 EF 存储过程的多个结果集的通用方法

    EF 6 NET 4 51 我正在尝试构建一个通用帮助程序类 它将帮助我将每个结果集 翻译 为类型安全类 如此处所述使用 SqlQuery 处理存储过程的多个结果 https stackoverflow com questions 2530
  • 实体框架 CTP 4 - 代码优先自定义数据库初始值设定项

    我想实现自定义数据库初始化策略 以便我可以生成数据库架构并使用提供的用户 ID 和密码将其应用到现有的空 SQL 数据库 不幸的是 内置策略无法提供我正在寻找的内容 The default strategy creates the DB o
  • 无法加载文件或程序集“EntityFramework,版本=6.0.0.0”

    我究竟做错了什么 我该如何解决这个问题 我有一个包含多个项目的解决方案 它是一个 MVC NET 4 5 Web 应用程序 在调试模式下启动后调用其中一个项目时 出现此错误 导致此错误的项目具有以下参考 两个都是版本6 0 0 0 应用程序
  • FindAsync 很慢,但是延迟加载很快

    在我的代码中 我曾经使用加载相关实体await FindAsync 希望我能更好地遵守 C 异步指南 var activeTemplate await exec DbContext FormTemplates FindAsync exec
  • VS2012 中的实体框架问题 - 重命名属性不粘

    我试图在 VS2012 中创建一个新项目 其中包含管理 MVC4 项目 网站 MVC4 项目和通用实体框架 dll 项目 我使用了现有的数据库并从中生成了我的实体 我更新了一些关系属性的名称并保存 然后 我将对实体框架项目的引用添加到我的两
  • .NET 3.5 中的实体框架延迟加载

    由于服务器限制 我仅限于 Net 3 5 我使用 Linq to SQL 进行延迟加载 但后来切换到实体框架 L2E 在 3 5 中没有延迟加载 而 L2S 有 有没有办法以某种方式重新生成模板来实现这一目标 您必须在 EF 1 NET 3
  • MetadataException:无法加载指定的元数据资源

    突然间我不断收到MetadataException在实例化我生成的ObjectContext班级 App Config 中的连接字符串看起来正确 自上次工作以来没有更改 我尝试从底层数据库重新生成一个新模型 edmx 文件 没有任何更改 有
  • 如何使用 Entity Framework 和 Identity 解决对象处置异常 ASP.NET Core

    我正在尝试编写一个控制器 该控制器接收来自 AJAX 调用的请求并通过 DBContext 对数据库执行一些调用 但是 当我发出命令时var user await GetCurrentUserAsynch 在对 DBContext 的任何调
  • 如何重用具有稍微不同的 ProcessStartInfo 实例的 Process 实例?

    我有以下开始的代码robocopy https technet microsoft com en us library cc733145 aspx as a Process 我还需要进行数据库查询以确定每次需要复制哪些目录robocopy被
  • 为什么 EF DataBase First 不使用 getdate()?

    我首先使用 EF 4 1 和数据库 示例表 CREATE TABLE dbo Product ID int IDENTITY 1 1 not null Title nvarchar 200 not null CreateDate datet
  • MVC3 和实体框架

    我的问题很简单 将 edmxMVC3 项目的 Web 应用程序的模型文件夹中的文件吗 我的答案非常简单 不要用数据访问逻辑和数据建模搞乱表示层 整个 MVC 应用程序 Visual Studio 解决方案中从下到上至少有 4 个项目 1 P
  • 从数据库加载而不使用代理类?

    在 Entity Framework 4 中 是否可以选择将一些查询加载到 POCO 中而不使用代理类 为了缓存该对象以供将来只读使用 我正在使用存储库 服务模式 我的意思是 var order orderService GetById 1
  • 学习实体框架[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将 ASP.NET Identity 实施到现有数据库中

    我有一个现有的项目和 SQL 数据库 其中包含一个用户表 我们称之为 MyOldUsersTable 和带有 PK FK 关系的附加表 地址 电话 职位等 注意 该数据库不使用成员身份或身份 它是从另一个项目中提取的数据库 MyOldUse
  • C# 中 LINQ 中的按多列分组

    我有一个类如下 public class ActualClass public string BookName get set public string IssuerName get set public DateTime DateOfI
  • 每个数据库多个/单个 *.edmx 文件

    我有一个通过 ADO net 数据服务与数据库交互的项目 数据库很大 近 150 个具有依赖关系的表 该项目几年前开始 当时使用的是数据集 现在我们正在转向实体模型关系 由于我们添加了更多需要使用的表 该模型正在不断增长 这是管理这一切的正
  • 实体框架中的批量插入

    我使用批量插入插入大量记录 例如 20K 当我仅插入一个实体时 它会正常工作 但是 当我用来插入多个实体 例如一对多 时 它将仅插入父实体 而不会插入子实体 我的实体和代码 Customer cs public class Customer
  • OWIN 可以替代 ASP.NET MVC 应用程序中的 DI 吗?

    大约一年前 在 Visual Studio 中创建时自动生成的 MVC 项目不包含任何有关 OWIN 的内容 作为再次申请并试图了解这些变化的人 我想知道 OWIN 是否可以替代我的 DI 据我了解 Startup Auth cs 中的以下
  • 实体框架:从模型生成数据库从模型存储中删除存储过程

    我正在使用带有 EF 4 模型的存储过程 为了实现这一目标 我将执行以下步骤 我通过从数据库更新并选择它来将存储过程添加到我的模型存储中 添加了函数导入以指向存储过程 存储过程返回连接多个表等的查询结果 因此在 返回集合 我指定的区域复合型

随机推荐