如何使用不同的主键克隆对象

时间:2017-06-07 01:39:03

标签: c# .net realm

我有这个类Cart_Record,如下所示。我想更新PrimaryKey。为此,我尝试将对象克隆到新对象中以复制CartLines并更新ID。我没有在问题队列或文档中找到太多帮助我。

public class Cart_Record : RealmObject
{
    public Cart_Record() { }

    public Cart_Record(IList<Cart_Line> cartLines, int id)
    {
        ID = id;
        foreach (var cartLine in cartLines)
            CartLines.Add(App.RealmDB.Find<Cart_Line>(cartLine.ProductId));
    }

    [PrimaryKey]
    public int ID { get; set; }

    public IList<Cart_Line> CartLines { get; }
}

我正在尝试这个

var appCart = App.RealmDB.All<Cart_Record>().First();

App.RealmDB.Write(() =>
{
    var cartLines = new List<Cart_Line>(appCart.CartLines);
    App.RealmDB.Remove(App.RealmDB.Find<Cart_Record>(appCart.ID));
    App.RealmDB.Add<Cart_Record>(new Cart_Record(cartLines, serverCart.ID));
});

但是我不断获得异常,特别是RealmObjectManagedByAnotherRealmException。我不明白为什么我没有将Cart_Line对象读取到Realm,只读到新对象中的CartLine列表。

我做错了什么?

提前谢谢。

编辑:我发现了一些有效的东西,但我想看看其他人是否有更好的方法。这对我有用。

var appCart = App.RealmDB.All<Cart_Record>().First();                       
App.RealmDB.Write(() =>
{
    var cartLines = new List<Cart_Line>(appCart.CartLines);
    App.RealmDB.Remove(App.RealmDB.Find<Cart_Record>(appCart.ID));
    var newAppCart = App.RealmDB.Add<Cart_Record>(new Cart_Record() { ID = serverCart.ID });
    foreach (var cartLine in cartLines)
        newAppCart.CartLines.Add(cartLine);
});

1 个答案:

答案 0 :(得分:1)

我不确定App.RealmDB幕后的内容,但是使用开箱即用的Realm API,您可以通过简单地将CartLines从原始版本添加到更新的对象:

// Assume want to change Id from 1 to 2
var realm = Realm.GetInstance();
var original = realm.Find<Cart_Record>(1); 

var updated = new Cart_Record { ID = 2 }; // other properties must be copied here
foreach (var cart in original.CartLines)
{
    updated.CartLines.Add(cart);
}

realm.Write(() =>
{
    realm.Remove(original);
    realm.Add(updated);
});

// updated now has all the original's CartLines