2014-12-17 2 views
0

Я следующий код, который я делаю для моей ORMLite Demo:ORMLIte [ServiceStack]. Метод SaveReference не добавлять элементы в список

[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 и заказа со списком Заказывает собственность.
  2. Я могу вызвать Db.SaveReferences (user, user.Orders) и увидеть, что если я что-то изменил внутри домена, тогда он работал очень хорошо.
  3. Однако, ЕСЛИ я добавляю новый элемент в список, ORMLite не сохраняет это.

Моего тест ниже демонстрирует эту probem очень хорошо

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 не отражает его, хотя ....

Вот как Repository выглядит как для Find() и Update() методы:

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); 
      } 
     } 
+0

Можете ли вы предоставить реализацию хранилища 'Find()' и 'Update()', так как это не ясно, что OrmLite API, вы используете в этих методах. – mythz

+0

Прошу прощения за недостающие детали. Я обновил исходный вопрос с помощью реализаций – TeaLeave

+0

Я также добавил, что я использую псевдоним под названием «ProUser» для Domainuser. – TeaLeave

ответ

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); 
} 
+0

Это сработало! Спасибо !!! – TeaLeave