Я следующий код, который я делаю для моей 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; }
}
- Теперь, как вы можете заметить, есть ссылочная связь между DomainUser и заказа со списком Заказывает собственность.
- Я могу вызвать Db.SaveReferences (user, user.Orders) и увидеть, что если я что-то изменил внутри домена, тогда он работал очень хорошо.
- Однако, ЕСЛИ я добавляю новый элемент в список, 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);
}
}
Можете ли вы предоставить реализацию хранилища 'Find()' и 'Update()', так как это не ясно, что OrmLite API, вы используете в этих методах. – mythz
Прошу прощения за недостающие детали. Я обновил исходный вопрос с помощью реализаций – TeaLeave
Я также добавил, что я использую псевдоним под названием «ProUser» для Domainuser. – TeaLeave