实体框架核心将记录插入数据库

时间:2019-08-09 16:56:19

标签: c# entity-framework-core

我在我的项目中使用Entity Framework Core。我的实体看起来像这样:

[Table("Policy")]
public class Policy
{
    [Key]
    public Guid Id { get; set; }    
    public Bank Bank { get; set; }          
    public string LastUpdateBy { get; set; }    
}

[Table("Bank")]
public class Bank
{
    [Key]
    public Guid Id { get; set; }    
    public string Code { get; set; }    
    public DateTime? CreateTs { get; set; } 
}

在SQL中,表Policy如下所示:

Id (uniqueidentifier)
Bank (varchar)
LastUpdateBy (varchar)

我要在Bank实体中引用Policy,因为我希望拥有亲子关系。

当我尝试在Policy表中添加记录时,出现以下错误

  

违反主键约束“ PK_Bank”。无法在对象“ dbo.Bank”中插入重复密钥。重复的密钥值为(829e0798-c7ee-4fcf-b18d-0fbc60f63fad)。

这是我的代码:

var policy = new Policy
{
    Bank = new Bank
    {
        Id = "829e0798-c7ee-4fcf-b18d-0fbc60f63fad"
    },
    Id = Guid.NewGuid(),
    LastUpdateBy = "User"
};

dbContext.Policy.Add(policy);
dbContext.SaveChanges();

我知道,它也在尝试在Bank表中添加一条记录。我如何告诉EF Core仅在Policy表中插入记录?

2 个答案:

答案 0 :(得分:1)

银行是一个存在的实体(单身),银行不会改变,它的属性是它自己的。保单是由银行签发的,因此,保单应通过bank Guid或ID属性(外键)引用银行,这将创建您需要的父级->子级关系。这是ONE-TO-MANY关系。我认为您可能想要花更多的时间来学习数据库关系设计,或者在创建实体类之前将这些内容画在纸上。

编辑:Igor为您提供了一个选择,可以沿途而已,并且不会更改您的实体,但是我认为您应该认真考虑以一种能够反映数据库关系设计的方式来构造您的实体。只是我的意见。

答案 1 :(得分:1)

如果您不想为Bank引入外键,则必须先附加银行。

var bank = new Bank
{
    Id = "829e0798-c7ee-4fcf-b18d-0fbc60f63fad"
};
dbContext.Bank.Attach(bank);

var policy = new Policy
{
    Bank = bank,
    Id = Guid.NewGuid(),
    LastUpdateBy = "User"
};

dbContext.Policy.Add(policy);
dbContext.SaveChanges();