繁体   English   中英

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

[英]Entity Framework Code First adding record error

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

联系方式类型:

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,只需为接收者分类一个新的Contact Method。

我不知道什么时候发生。 也许我的模型不正确? 根据选择的类型,我拉出该Type对象,并将其设置为ContactMethod.Type变量。 但是,就像我说的那样,它试图重新创建它,而不仅仅是将其链接到现有的ContactMethodType上,并且由于该GUID已经存在,所以我收到一个错误消息,因为键(GUID)已经存在,因此无法创建记录。

有任何想法吗?

在与Marek脱机讨论此问题之后,假设要添加的图中的所有实体都是新实体,则可以归结为DbSet<TEntity>.Add(entity)

API文档添加 ...

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

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

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

您还可以查看DbContext.ChangeTracker.TrackGraph(...) ,有关更多信息,请参阅API文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM