MVC3 EF4在保存时复制外键对象

时间:2011-07-30 21:14:32

标签: c# entity-framework asp.net-mvc-3 entity-framework-4 code-first

我正在使用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 = 2specificEvent = X保存Order对象时,在DB中创建一个新的SpecificEvent对象,即使已经存在ID为2的特定事件X DB。当我尝试使用specificEventId = 2specificEvent = null时,我收到了数据验证错误。

我做错了什么?我希望SpecificEventSeasonalTicket可以为空,我不希望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条款。

1 个答案:

答案 0 :(得分:1)

真正的问题是,你从哪里获得X的实例?好像EF不知道这个实例。您需要通过EF获取已存在的SpecificEvent并使用它返回的代理来设置您的导航属性,或者告诉EF“附加”X,以便它知道您的意图是什么。就EF而言,您似乎正在尝试向其发送具有冲突ID的新实例,因此它正确地发出错误。