【问题标题】:Entity Framework - Violation of primary key when adding object to database实体框架 - 将对象添加到数据库时违反主键
【发布时间】:2018-09-20 06:32:24
【问题描述】:

我有两张桌子,一张叫Vm,另一张叫Datastore,它们之间的关系是一对多。一个Vm 只能有一个Datastore,但一个Datastore 可以有多个Vms。我有 2 节课和一个基本的后期操作。

public class Datastore
{
    // Primary Key
    [Key]
    public string DatastoreId { get; set; }
    public string Name { get; set; }

}

public class Vm
{   
    // Primary Key
    public int Id { get; set; }
    public string Name { get; set; }
    public int PowerState { get; set; }
    public int NumCpu { get; set; }
    public int MemoryGB { get; set; }

    //Foreign Key
    public string DatastoreId { get; set; }
    //Navigation Property
    public Datastore Datastore { get; set; }
}

// POST: api/Vms
[ResponseType(typeof(Vm))]
public async Task<IHttpActionResult> PostVm(Vm vm)
{
    if (!ModelState.IsValid)
    {
       return BadRequest(ModelState);
    }

    db.Vms.Add(vm);

    await db.SaveChangesAsync();

    return CreatedAtRoute("DefaultApi", new { id = vm.Id }, vm);
}

问题是,当我发布一个虚拟机时,它看起来好像没有检测到外来物的存在。因此,它尝试在已存在此主键的表 Datastores 中创建外键 DatastoreId。我是否必须测试密钥是否存在?如果是这样,我们是否配置一二多关系?

当我用这个在 Postman 中测试 post 方法时,它只有在 DatastoreId 存在时才有效

{
    "DatastoreId": "datastore2",
    "Name": "VM006",
    "PowerState": 0,
    "NumCpu": 2,
    "MemoryGB": 4
}

但是当我用这个在 Postman 中测试 post 方法时,它只有在 DatastoreId 尚不存在时才有效

{
    "Datastore": {
        "DatastoreId": "datastore2",
        "Name": "DAL"
    },
    "Name": "VM006",
    "PowerState": 0,
    "NumCpu": 2,
    "MemoryGB": 4
}

感谢您的回复!

【问题讨论】:

  • 您可以将您发送的数据以文本格式发布吗?
  • 我编辑帖子
  • Vm 类的 Id 上添加 [Key] 属性怎么样?
  • 我试试,我告诉你
  • 不行

标签: c# database entity-framework entity-framework-6 entity


【解决方案1】:

你必须在保存之前找到数据存储ID的存在。

使用以下代码检查是否存在

Datastore= context.datastores.Single(c => c.datastoreid == @dataatoreid)

【讨论】:

  • 是的,它可以测试 DatastoreId 的存在,谢谢。现在我必须完成我的功能以使用现有的 DatastoreId(如果存在)或添加新的 DatastoreId(如果不存在)。但我仍然不明白为什么它不是自动的。我的意思是,如果我们配置一对多关系,我认为它会自动测试存在性。
  • 顺便说一句,我找到了@SteveWillcock 的一个有趣答案,他描述了用于跟踪现有或不存在项目的不同功能。在这篇文章stackoverflow.com/a/3485370/9095242
猜你喜欢
  • 2022-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多