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.Attach
或context.Entry
将您的用户添加到跟踪实体。您也可以尝试将代码更改为:
using (TContext context = new TContext())
context.Configuration.LazyLoadingEnabled = false;
context.Attach(entity)
return context.SaveChanges();
【讨论】:
以上是关于EntityFramework 一对多关系重复插入问题的主要内容,如果未能解决你的问题,请参考以下文章
尝试插入具有 1:N 关系的实体时,重复键值违反 EntityFramework 中的唯一约束“PK_Users”错误