加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何在不获取重复的情况下添加与现有实体关系的新实体? (

发布时间:2020-12-15 22:03:47 所属栏目:百科 来源:网络整理
导读:首先使用Web API 2和EF 6.1代码. 我正在尝试添加一个新模板(参见模型),该模板与已有的TimePeriods和Stations有关系. public class Template{ public int TemplateID { get; set; } public string Name { get; set; } public ListTimePeriod TimePeriods { ge
首先使用Web API 2和EF 6.1代码.

我正在尝试添加一个新模板(参见模型),该模板与已有的TimePeriods和Stations有关系.

public class Template
{
    public int TemplateID { get; set; }
    public string Name { get; set; }

    public List<TimePeriod> TimePeriods { get; set; }
    public List<Station> Stations { get; set; }
}

public class Station
{
    public int StationID { get; set; }
    public string Name { get; set; }

    public List<Template> Templates { get; set; }
}

public class TimePeriod
{
    public int TimePeriodID { get; set; }
    public TimeSpan From { get; set; }
    public TimeSpan To { get; set; }
    public List<Template> Templates { get; set; }
}

新模板对象包含Station列表和具有正确ID /主键的TimePeriod列表.我希望EF能够通过查看主键来识别相关实体已经存在,但似乎没有.相反,所有相关实体再次添加导致重复.

private SchedulingContext db = new SchedulingContext();

[ResponseType(typeof(Template))]
public IHttpActionResult PostTemplate(Template template)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    db.Templates.Add(template);
    db.SaveChanges();

    return CreatedAtRoute("DefaultApi",new { id = template.TemplateID },template);
}

这是否与我使用新的上下文有关?如果是这样,我该如何防止这种行为?

解决方案感谢Evandro:

public void PostTemplate(Template template)
{
    db.Templates.Add(template);

    foreach (var item in template.Stations)
    {
        db.Entry<Station>(item).State = EntityState.Unchanged;
    }

    foreach (var item in template.TimePeriods)
    {
        db.Entry<TimePeriod>(item).State = EntityState.Unchanged;
    }
    db.SaveChanges();
}

解决方法

Lorentz,这是Entity Framework的默认行为.您必须根据系统应该执行的操作明确定义自定义行为.

首先,您可以使用以下示例访问上下文中的实体状态:

EntityState state = db.Entry<Station>(station).State;

您可以打印状态,然后查看EF正在做什么.

现在,当您第一次收到Template的实例时,它在上下文中的状态将被分离.

将其添加到上下文后,状态将更改为“已添加”.这将适用于模板,站点和TimePeriod(s).

即使您正确设置了Id(主键),EF也会丢弃ID,创建新ID并向表中添加新行,这就是您的程序正在发生的事情.这就是我设法在我的代码中重现的东西.

您必须为每个实体定义EntityState,以便EF知道它不应该保留新项目.以下是EF 6.1的可能值:

// This is probably what you are looking for
db.Entry<Station>(station).State = EntityState.Unchanged;

// This one maybe,if you are receiving updated values for the State
db.Entry<Station>(station).State = EntityState.Modified; 

// Others that may apply for other scenarios
db.Entry<Station>(station).State = EntityState.Detached;
db.Entry<Station>(station).State = EntityState.Added;
db.Entry<Station>(station).State = EntityState.Deleted;

由于模板有多个用于Station和TimePeriod的itens,你必须迭代它们并将每个设置为“Unchanged”我假设或“修改”.

如果有效,请告诉我.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读