保存实体会导致重复插入查找数据

| 我正在使用EF 4.1“代码优先”来创建数据库和对象。 鉴于:
public class Order 
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual OrderType OrderType { get; set; }
}

public class OrderType 
{
    public int Id { get; set; }
    public string Name { get; set; }
}
订单具有一种订单类型。订单类型只是一个查询表。值不变。使用Fluent API:
//Order
ToTable(\"order\");
HasKey(key => key.Id);
Property(item => item.Id).HasColumnName(\"order_id\").HasColumnType(\"int\");
Property(item => item.Name).HasColumnName(\"name\").HasColumnType(\"string\").HasMaxLength(10).IsRequired();

HasRequired(item => item.OrderType).WithMany().Map(x => x.MapKey(\"order_type_id\")).WillCascadeOnDelete(false);

//OrderType
ToTable(\"order_type\");
HasKey(key => key.Id);

Property(item => item.Id).HasColumnName(\"order_type_id\").HasColumnType(\"int\");
Property(item => item.Name).HasColumnName(\"name\").HasColumnType(\"nvarchar\").HasMaxLength(100).IsRequired(); 
现在,在我们的应用程序中,我们加载所有查找数据并将其缓存。
var order = new Order
{
   Name = \"Bob\"
   OrderType = GetFromOurCache(5) //Get order type for id 5
};

var db = _db.GetContext();
db.Order.Add(order);
db.SaveChanges();
我们的您的美丽订单已保存,但使用EF提供的新订单类型。因此,现在我们的数据库中有两个相同的订单类型。我该怎么做才能改变这种行为? TIA     
已邀请:
使用EF 4.1,您可以在呼叫
SaveChanges
之前执行此操作:
db.Entry(order.OrderType).State = EntityState.Unchanged;
    
除了Yakimych的解决方案之外,您还可以在添加订单之前将OrderType附加到上下文,以使EF知道该OrderType已存在于数据库中:
var order = new Order
{
    Name = \"Bob\"
    OrderType = GetFromOurCache(5) //Get order type for id 5
};

var db = _db.GetContext();
db.OrderTypes.Attach(order.OrderType);
db.Order.Add(order);
db.SaveChanges();
    
Yakimych / Slauma-感谢您的回答。有趣的是,我尝试了两种方式,但都没有起作用。因此,我问了一个问题。您的回答证实了我一定做错了事,并且确定我没有正确管理dbContext。 即使您提供了完整的对象(包括查找唯一ID),EF仍要自动插入查找/静态数据仍然很麻烦。这使开发人员有责任记住设置状态。为了使事情变得容易一些,我这样做:
var properties = entry.GetType().GetProperties().Where(x => x.PropertyType.GetInterface(typeof(ISeedData).Name) != null);
foreach (var staticProperty in properties)
{
    var n = staticProperty.GetValue(entry, null);
    Entry(n).State = EntityState.Unchanged;
}  
在SaveChanges覆盖中。 再一次感谢你的帮助。     

要回复问题请先登录注册