我有两个实体Result
和Rule
。 Result
包含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();
}