实体框架尝试将现有记录插入数据库

时间:2017-11-02 23:00:04

标签: c# .net database entity-framework

我有两个实体ResultRuleResult包含Rule。我从数据库中获取Rule并尝试使用不同的上下文将其分配给多个Result对象。

当我尝试context.SaveChanges()时,实体框架会尝试再次将已存在的Rule插入数据库。在过去的几个小时里,我尝试过不同的附加和改变状态的组合,我感到茫然。

可能导致此行为的原因是什么?

实体:

public class Result
{
    public int Id { get; set; }

    public int RuleId { get; set; }
    public Rule Rule { get; set; }
}

public class Rule
{
    public Rule()
    {
        Results = new HashSet<Result>();
    }

    public int Id { get; set; }
    public string Identifier { get; set; }
    public ICollection<Result> Results { get; set; }
}

映射:

public class ResultMapping : EntityTypeConfiguration<Result>
{
    public ResultMapping()
    {
        ToTable("Result");
        HasKey(x => x.Id);

        HasRequired(x => x.Rule)
            .WithMany(y => y.Results)
            .HasForeignKey(x => x.RuleId);
    }
}

public class RuleMapping : EntityTypeConfiguration<Rule>
{
    public RuleMapping()
    {
        ToTable("Rule");
        HasKey(x => x.Id);
        Property(x => x.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    }
}

分配:

private void DoStuff(ICollection<Result> results, ScanResultContext context)
{
    foreach (var result in results)
    {
        var rule = RulesFromAnotherContextDictonary[result.Rule.Identifier];

        // None of this makes it work
        context.Set<Rule>().Attach(rule);
        result.Rule = null;
        result.RuleId = rule.Id;

        context.Set<Result>().Add(result);
    }

    context.SaveChanges();
}

尝试2:

private void DoStuff(ICollection<Result> results, ScanResultContext context)
{
    foreach (var result in results)
    {
        var rule = RulesFromAnotherContextDictonary[result.Rule.Identifier];

        // None of this makes it work
        context.Set<Rule>().Attach(rule);
        result.Rule = rule;
        context.Set<Result>().Add(result);
    }

    context.SaveChanges();
}

尝试3:

private void DoStuff(ICollection<Result> results, ScanResultContext context)
{
    foreach (var result in results)
    {
        var rule = context.Set<Rule>().FirstOrDefault(x => x.Identifier == result.Rule.Identifier);

        if (rule != null)
            result.Rule = rule;

        context.Set<Result>().Add(result);
    }

    context.SaveChanges();
}

0 个答案:

没有答案