实体框架代码首先添加记录错误

时间:2016-11-17 20:22:48

标签: c# mysql entity-framework asp.net-core

好的,让我从我的模型开始:

联系方式类型:

public class ContactMethodType
{
    [Key]
    [HiddenInput(DisplayValue = false)]
    public Guid ContactMethodTypeGUID { get; set; }

    [Required(ErrorMessage = "Please enter a Contact Method Type Name.")]
    public string Name { get; set; }

    [Required(ErrorMessage = "Please enter a brief description.")]
    public string Description { get; set; }

    public bool IsActive { get; set; }

    public virtual ICollection<ContactMethod> ContactMethods { get; set; }

联系方式:

public class ContactMethod
{
    [Key]
    [HiddenInput(DisplayValue = false)]
    public Guid ContactMethodGUID { get; set; }

    public virtual ContactMethodType Type { get; set; }

    public string CountryCode { get; set; }

    [Required]
    public string Identifier { get; set; }

    public bool IsPreferred { get; set; }

}

收件人:

public class Recipient
{
    [Key]
    public Guid RecipientGUID { get; set; }

    [Required(ErrorMessage = "Please enter a Recipient's First Name.")]
    public string FirstName { get; set; }

    [Required(ErrorMessage = "Please enter a Recipient's Last Name.")]
    public string LastName { get; set; }

    public string Company { get; set; }

    public UserGroup Owner { get; set; }

    public List<ContactMethod> ContactMethods { get; set; }

    public User CreatedBy { get; set; }

    public DateTime CreatedOn { get; set; }

    public User LastModifiedBy { get; set; }

    public DateTime LastModifiedOn { get; set; }

    public bool IsActive { get; set; }

}

我已经定义了两种联系方式类型: 电子邮件和短信

现在我正在创建一个新的收件人,所以我将所有必需的数据添加到我的收件人对象,然后我打电话:

context.Recipients.Add(myRecipient);
context.SaveChanges();

我得到的是一个错误,我想在一个已存在时添加一个新的ContactMethodType。但这应该是一对多的关系,我不想添加新的ContactMethodType,只是为我的收件人分类一个新的联系方式。

我不确定这是什么时候发生的。也许我的模特不正确?根据选择的类型,我拉出Type对象,并将其设置为ContactMethod.Type变量。但就像我说的那样,它不是仅仅将其链接到现有的ContactMethodType,而是尝试重新创建它,并且由于GUID已经存在,我得到的错误是无法创建记录,因为密钥(GUID)已经退出。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

在与Marek离线讨论之后,假设添加的图表中的所有实体都是新的,它会归结为DbSet<TEntity>.Add(entity)

来自The API docs for Add ...

  

开始跟踪给定实体以及尚未被跟踪的任何其他可到达实体处于已添加状态,以便在调用SaveChanges()时将它们插入到数据库中。

由于此模型使用客户端生成的密钥,这意味着所有实体在将其赋予上下文之前都已分配了密钥值,因此您无法使用任何&#34;更智能的&#34;方法(例如DbSet<TEntity>.Attach(entity))将检查关键值,以确定每个实体是新实体还是现有实体。

添加新收件人后,您可以在每个现有实体上使用调用DbSet<TEntity>.Attach(entity)(即联系方式类型)。或者,DbContext.Entry(entity).State = EntityState.Unchanged也会让EF知道实体已经在数据库中。

您还可以查看DbContext.ChangeTracker.TrackGraph(...),有关详细信息,请参阅API docs