EntityFramework 一对多关系重复插入问题

Posted

技术标签:

【中文标题】EntityFramework 一对多关系重复插入问题【英文标题】:EntityFramework one to many relationship repeated insert problem 【发布时间】:2020-10-12 10:23:41 【问题描述】:
enter code here

[Table("Articles")]
public class Article : IEntity

    [Required, StringLength(60)]
    public string Title  get; set; 
    public int CategoryId  get; set; 
    [Required, StringLength(2500)]
    public string Text  get; set; 
    public int LinkCount  get; set; 
    public virtual User Owner  get; set; 
    public virtual Category Category  get; set; 
    public virtual html_Content_Result HtmlPage  get; set; 
    public virtual List<Comment> Comments  get; set; 
    public virtual List<Liked> Likes  get; set;        


    [Table("Users")]
public class User : IEntity

    [StringLength(25)]
    public string Name  get; set; 
    [StringLength(25)]
    public string Lastname  get; set; 
    [StringLength(25), Required]
    public string Username  get; set; 
    [StringLength(100), Required]
    public string Password  get; set; 
    [StringLength(70), Required]
    public string Email  get; set; 
    public bool IsActive  get; set; 
    [Required]
    public Guid ActivateGuid  get; set; 
    public virtual List<Article> Articles  get; set; 
    public virtual List<Comment> Comments  get; set; 
    public virtual List<UsersRole> UsersRoles  get; set; 
    public virtual List<Liked> Likes  get; set; 

enter image description here

我有两个名为 User 和 Article 的实体。 我首先使用实体​​框架代码创建了我的数据库。 这两个表之间存在一对多的关系。 问题是当我向文章表插入操作时,我从会话添加到模型用户实体并在我的用户表上插入重复的输入,因为我之前已经插入了我的用户。

我应该怎么做才能解决?

【问题讨论】:

请添加产生重复的插入代码。 当然,我在下面加了。 1) 请将其添加到问题 2) 请添加适用于实体框架的代码 【参考方案1】:
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    [ValidateInput(false)]
    public ActionResult Index(Article model)
    
        BusinessLayerResult<Article> res = new BusinessLayerResult<Article>();
        res.Result = model;
        if (ModelState.IsValid)
        
            model.HtmlPage.Id = res.Result.Id;
            model.Owner = Session["user"] as User;
            _articleService.Add(res);

        
      

【讨论】:

【参考方案2】:
   public int Add(TEntity entity)
    
        if (entity is IEntity)
        
            IEntity myEntity = entity as IEntity;
            DateTime dateTime = DateTime.Now;
            myEntity.CreatedOn = dateTime;
            myEntity.ModifiedOn = dateTime;
            myEntity.ModifiedUsername = identity.Id.ToString();
        
        using (TContext context = new TContext())
        
            context.Configuration.LazyLoadingEnabled = false;
            var addedEntity = context.Entry(entity);
            addedEntity.State = EntityState.Added;
            return context.SaveChanges();
        
    

【讨论】:

【参考方案3】:

问题是您正在创建不跟踪现有用户的新上下文 (model.Owner)。您似乎已经实现了通用存储库,我不确定在这种情况下如何处理此问题,但通常您需要使用context.Attachcontext.Entry 将您的用户添加到跟踪实体。您也可以尝试将代码更改为:

    using (TContext context = new TContext())
    
        context.Configuration.LazyLoadingEnabled = false;
        context.Attach(entity)
        return context.SaveChanges();
    

【讨论】:

以上是关于EntityFramework 一对多关系重复插入问题的主要内容,如果未能解决你的问题,请参考以下文章

实体框架:多对多插入重复

尝试插入具有 1:N 关系的实体时,重复键值违反 EntityFramework 中的唯一约束“PK_Users”错误

Entity Framework 和 .NET 的一对一关系

实体框架中的可选一对多关系[关闭]

hibernate配置双向一对多的时候,困惑了

核心数据一对多插入与现有关系swift