[英]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.