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

ozc*_*cho 2 c# entity-framework-4 ef-code-first entity-framework-4.1

我使用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; }
}
Run Code Online (Sandbox Code Playgroud)

订单有一个ordertype.订单类型只是一个查找表.价值观不会改变.使用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(); 
Run Code Online (Sandbox Code Playgroud)

现在在我们的App中,我们加载所有查找数据并对其进行缓存.

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();
Run Code Online (Sandbox Code Playgroud)

我们的您自己的订单已保存,但新订单类型,由EF提供​​.所以现在我们的数据库中有两个相同的订单类型.我该怎么做才能改变这种行为?

TIA

Yak*_*ych 6

使用EF 4.1,您可以在调用之前执行此操作SaveChanges:

db.Entry(order.OrderType).State = EntityState.Unchanged;
Run Code Online (Sandbox Code Playgroud)