无法在Linq2Sql中添加子实体

时间:2012-05-08 17:00:56

标签: sql-server linq linq-to-sql

我有2种实体类型买家和买家订单。买方可以包含多个BuyerOrders,并且用户可以编辑BuyerOrders列表。当我想添加一些BuyerOrders时,我称之为方法:

private static void CreateOrdersForBuyer(Buyer buyer, int[] selectedLeadTypes)
{
    foreach (var order in selectedLeadTypes.Select(leadTypeId => new BuyerOrder
         {
             Buyer = buyer,
             OfferTypeID = (int) OfferTypes.Referral,
             Price = 1,
             RegistrationDate = DateTime.Now,
             StatusID = (int) BuyerOrderStatus.Pending,
             LeadtypeID = leadTypeId,
             Profit = 1
         }))

    {
        buyer.BuyerOrders.Add(order);
    }
}

然后保存买家:

GenericRepository.Instance.Save(buyer);

保存方法:

public virtual void Save<T>(T value) where T : class
{
    //LegalLeadsDataContext.Instance = null;
    LegalLeadsDataContext.Instance.GetTable<T>().Attach(value);
    LegalLeadsDataContext.Instance.Refresh(RefreshMode.KeepCurrentValues, value);
    LegalLeadsDataContext.Instance.SubmitChanges();
}

之后我发现数据库中没有新的BuyerOrders。我做错了什么?

1 个答案:

答案 0 :(得分:1)

来自MSDN documentation

KeepCurrentValues :强制Refresh方法将原始值与从数据库中检索的值交换。没有修改当前值。

KeepChanges

KeepChanges :强制Refresh方法保留已更改的当前值,但使用数据库值更新其他值。

此外,Attach方法使用允许您指定“已修改”的重载。

因此,在您的代码中,您可能需要更改

public virtual void Save<T>(T value) where T : class
{
    //LegalLeadsDataContext.Instance = null;
    LegalLeadsDataContext.Instance.GetTable<T>().Attach(value, true);
    LegalLeadsDataContext.Instance.Refresh(RefreshMode.KeepChanges, value);
    LegalLeadsDataContext.Instance.SubmitChanges();
}