实体框架 - 将对象添加到数据库时违反主键

时间:2018-04-10 15:02:23

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

我有两个表,一个名为Vm,另一个名为Datastore,两者之间的关系为一两对。 Vm只能有一个Datastore,但Datastore可以有几个Vm个。我有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);
}

问题是当我发布vm时,看起来它没有检测到外来存在。因此,它尝试在已存在此主键的表数据存储中创建外键数据记录Id。我是否必须测试密钥是否存在?如果是这样,我们配置一对二关系吗?

当我在Postman中测试post方法时,它仅在DatastoreId存在的情况下才有效

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

但是当我用Postman测试postman中的post方法时,只有DatastoreId尚不存在

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

感谢您的回复!

1 个答案:

答案 0 :(得分:0)

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

使用以下代码检查存在

Datastore = context.datastores.Single(c =&gt; c.datastoreid == @dataatoreid)