c# - Entity Framework 代码首先添加记录错误

标签 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。但这应该是一对多的关系,我不想添加新的 ContactMethodType,只需为我的收件人分类新的联系方法。

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

有什么想法吗?

最佳答案

与 Marek 线下讨论后,结果归结为 DbSet<TEntity>.Add(entity)假设图中添加的所有实体都是新的。

来自The API docs for Add ...

Begins tracking the given entity, and any other reachable entities that are not already being tracked, in the Added state such that they will be inserted into the database when SaveChanges() is called.

由于此模型使用客户端生成的键,这意味着所有实体在提供给上下文之前都会分配一个键值,因此您无法使用任何可以检查的“更智能”方法(例如 DbSet<TEntity>.Attach(entity) )用于确定每个实体是新实体还是现有实体的关键值。

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

您还可以查看DbContext.ChangeTracker.TrackGraph(...) ,参见API docs了解更多信息。

关于c# - Entity Framework 代码首先添加记录错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40664315/

相关文章:

c# - 如何解决 switch 语句的 CA1820

mysql - 将多种类型的用户放入数据库的有效方法是什么

java - Eclipse:从 MySQL 生成实体 - 为什么实体中有 DAO 方法?

c# - Entity Framework Core-使用表达式树并以接口(interface)作为参数

c# - 解析XML和GPS数据以列出

c# - 有没有办法指示编译器不要为匿名委托(delegate)创建内部类?

c# - 如何从 C# with\r 获取 String 到 JavaScript 变量?

mysql - 在 MySQL RDS 上执行带有 ISNULL 条件查询的左连接需要很长时间

c# - Entity Framework Code First 中的多个自引用属性

asp.net-mvc - 如何在 MVC 索引页面中显示导航属性集合中的值