【问题标题】:ORMLIte[ServiceStack] . SaveReference method does not add items in the ListORMLite[ServiceStack] 。 SaveReference 方法不会在列表中添加项目
【发布时间】:2014-12-17 18:10:53
【问题描述】:

我正在为我的 ORMLite Demo 编写以下代码:

[Alias("ProUser")]
public class DomainUser : IProUser
{
    public int UserType { get; set; }
    public string Id{ get; set; }

    [Reference]
    public Address HomeAddress { get; set; }

    [Reference]
    public List<Order> Orders { get; set; }

    [Ignore]
    public UserType UserTypeEnum
    {
        get { return (UserType)UserType; }
        set { UserType = (int)value; }
    }
}

public class Order
{
    [AutoIncrement]
    public int Id { get; set; }

    public string ProUserId { get; set; }

    public string Details { get; set; }

}
  1. 现在,您可以注意到 DomainUser 和带有 List Orders 属性的 Order 之间存在引用关系。
  2. 我可以调用 Db.SaveReferences(user, user.Orders) 并查看如果我更改了域内的任何内容,那么它运行良好。
  3. 但是,如果我在列表中添加新项目,ORMLite 不会保存它。

我下面的测试很好地证明了这个问题

DomainUser user = repository.Find("Someone.Else") as DomainUser;
user.UserTypeEnum = UserType.Domain;
user.HomeAddress.StreetName = "Some new street";
user.Orders[1].Details = "Nestle Chocolates";
user.Orders.Add(new Order
{
    Details = "Reese",
    ProUserId = user.Id
});

// This one would be OK since the user already has two orders in the DB
Assert.AreEqual(2, user.Orders.Count);  
repository.Update(user);


DomainUser retval =  repository.Find(user.Id) as DomainUser;

// However, this one would fail because no new order has been added.
Assert.AreEqual(3, user.Orders.Count); 

令人困惑的是,我看到 ORMLite 正在尝试添加新记录,因为我看到正在执行插入查询。我不确定为什么 DB 没有反映它....

下面是 Find() 和 Update() 方法的 Repository 的样子:

public IProUser Find(string id)
        {
            DomainUser user = Db.LoadSingleById<DomainUser>(id);
            return user;
        }

 public IProUser Update(DomainUser user)
        {
            using(Db.OpenTransaction(IsolationLevel.ReadCommitted))
            { 
                Db.Save(user);
                Db.SaveReferences(user,user.HomeAddress);
                Db.SaveReferences(user,user.Orders);

                return Find(user.Id);
            }
        }

【问题讨论】:

  • 您能否提供存储库Find()Update() 的实现,因为不清楚您在这些方法中使用的是什么OrmLite API。
  • 很抱歉错过了这些细节。我用实现更新了原始问题
  • 我还添加了一个事实,即我为 Domainuser 使用了一个名为“ProUser”的别名。
  • 我无法重现此问题added in this commit。您使用的是什么版本的 OrmLite?
  • 实际上只是注意到您没有提交交易,我已将提交更新为show usage within a transaction

标签: c# orm servicestack ormlite-servicestack


【解决方案1】:

您需要明确提交您的 ADO.NET 事务,即:

using(var trans = Db.OpenTransaction(IsolationLevel.ReadCommitted))
{ 
    Db.Save(user);
    Db.SaveReferences(user,user.HomeAddress);
    Db.SaveReferences(user,user.Orders);

    trans.Commit();

    return Find(user.Id);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    相关资源
    最近更新 更多