我正在使用MVC3和EF4代码优先。我有以下型号:
public class Order {
public int ID { get; set; }
[Required]
public float Price { get; set; }
[Required]
public int PayMethodId { get; set; }
public PayMethod PayMethod { get; set; }
public int? SpecificEventId { get; set; }
public SpecificEvent SpecificEvent { get; set; }
public int? SeasonalTicketId { get; set; }
public SeasonalTicket SeasonalTicket { get; set; }
}
当我尝试使用specificEventId = 2
和specificEvent = X
保存Order对象时,在DB中创建一个新的SpecificEvent
对象,即使已经存在ID为2的特定事件X DB。当我尝试使用specificEventId = 2
和specificEvent = null
时,我收到了数据验证错误。
我做错了什么?我希望SpecificEvent
和SeasonalTicket
可以为空,我不希望EF4在这个对象中创建这些对象的新实例每当我保存'订单'时,DB。
更新
这是我在DB中保存Order
的代码:
public void SaveOrder(Order order)
{
Order fromDb = null;
// If editing an existing object.
if ((fromDb = GetOrder(order.ID)) != null)
{
db = new TicketsDbContext();
db.Entry(order).State = System.Data.EntityState.Modified;
db.SaveChanges();
}
// If adding a new object.
else
{
db.orders.Add(order);
db.SaveChanges();
}
}
当我保存时,我确实达到else
条款。
答案 0 :(得分:1)
真正的问题是,你从哪里获得X的实例?好像EF不知道这个实例。您需要通过EF获取已存在的SpecificEvent并使用它返回的代理来设置您的导航属性,或者告诉EF“附加”X,以便它知道您的意图是什么。就EF而言,您似乎正在尝试向其发送具有冲突ID的新实例,因此它正确地发出错误。