0

データベース マッピング用の Windows Phone 7 アプリケーションとクラスがあります。Poll クラスは次のようになります。

    [Table]
public class Poll // :BaseModel
{
    //private int _pid;
    //private string _pdesc;
    //private bool _pisopen;
    //private string _pname;
    //private bool _prandom;
    //private string _qlastupdticks;
    //private string _ticks;

    [Column(DbType = "INT NOT NULL IDENTITY(1,1)", IsPrimaryKey = true, IsDbGenerated = true)]
    public int id { get; set; }

    [Column(DbType = "INT")]
    public int pid { get; set; }
    //{
    //    get { return _pid; }
    //    set { SetValue(ref _pid, value, GetPropertyName(MethodBase.GetCurrentMethod())); }
    //}

    [Column]
    public string pdesc { get; set; }
    //{
    //    get { return _pdesc; }
    //    set { SetValue(ref _pdesc, value, GetPropertyName(MethodBase.GetCurrentMethod())); }
    //}

    [Column]
    public bool pisopen { get; set; }
    //{
    //    get { return _pisopen; }
    //    set { SetValue(ref _pisopen, value, GetPropertyName(MethodBase.GetCurrentMethod())); }
    //}

    [Column]
    public string pname { get; set; }
    //{
    //    get { return _pname; }
    //    set { SetValue(ref _pname, value, GetPropertyName(MethodBase.GetCurrentMethod())); }
    //}

    [Column]
    public bool prandom { get; set; }
    //{
    //    get { return _prandom; }
    //    set { SetValue(ref _prandom, value, GetPropertyName(MethodBase.GetCurrentMethod())); }
    //}

    [Column(DbType = "NVARCHAR(255)")]
    public string qlastupdticks { get; set; }
    //{
    //    get { return _qlastupdticks; }
    //    set { SetValue(ref _qlastupdticks, value, GetPropertyName(MethodBase.GetCurrentMethod())); }
    //}

    [Column(DbType = "NVARCHAR(255)")]
    public string ticks { get; set; }
    //{
    //    get { return _ticks; }
    //    set { SetValue(ref _ticks, value, GetPropertyName(MethodBase.GetCurrentMethod())); }
    //}

    public override bool Equals(object obj)
    {
        var item = obj as Poll;
        if (item != null)
        {
            Equals(item);
        }
        return false;
    }

    public bool Equals(Poll other)
    {
        if (ReferenceEquals(null, other)) return false;
        return (other.pid == pid);
    }

    public override string ToString()
    {
        return string.Format("{0}_{1}", GetType().Name, pid);
    }

    public override int GetHashCode()
    {
        return ToString().ToUpper().GetHashCode();
    }
}

保存方法は次のようになります。

 public bool RowsSave<T>(IEnumerable<T> entities, out string error)
    {
        error = string.Empty;
        bool res;
        var type = typeof (T);

        using (var ctx = new PpaDataContext(_connectionString))
        {
            try
            {

                var entitesInDb = ctx.GetTable(type).Cast<T>().ToList();

                var entitesForSave = new List<T>();

                foreach (var entity in entities)
                {
                    if (!entitesInDb.Contains(entity))
                    {
                        entitesForSave.Add(entity);
                    }
                    else
                    {
                        var index = entitesInDb.IndexOf(entity);
                        foreach (var prop in PropertiesGet(entity))
                        {
                            prop.SetValue(entitesInDb[index], prop.GetValue(entity, null), null);
                        }
                    }
                }
                if(entitesForSave.Count > 0)
                {
                    ctx.GetTable(type).InsertAllOnSubmit(entitesForSave);
                }
                ctx.SubmitChanges();
                res = true;
            }
            catch (Exception ex)
            {
                error = string.Format("{0}", ex.Message);
                res = false;
            }
        }
        return res;
    }

挿入しようとすると、各オブジェクトが 2 回挿入されます。このコードの何が間違っていますか? RowsSave メソッドは 1 回だけ呼び出します。

4

2 に答える 2

0

これは事実の少し後ですが、まったく同じ問題に遭遇しました。これは、オーバーライドされた等値演算子のエラーに関係しています。この特定のケースでは、コードが次の Equals 関数の値を返さないため、問題が発生します。

public override bool Equals(object obj)
{
    var item = obj as Poll;
    if (item != null)
    {
        Equals(item);
    }
    return false;
}

そのコードは常に false を返します。修正されたコードは次のようになります。

public override bool Equals(object obj)
{
    var item = obj as Poll;
    if (item != null)
    {
        return Equals(item);
    }
    return false;
}

LINQ-to-SQL は、挿入後に object equals 比較を使用します。どのようなコンテキストで、どのような理由でこれが発生するのかはわかりませんが、比較で false が返された場合は、挿入が再度実行されます。同じ動作が発生している場合は、エンティティのオーバーライドされた等価メソッドが正しいかどうかを確認してください。

于 2013-06-14T21:52:15.713 に答える
-1

次の行は必要ないと思います:

ctx.SubmitChanges();

次の行で挿入が行われています。

ctx.GetTable(type).InsertAllOnSubmit(entitesForSave); 
于 2012-05-17T20:28:44.450 に答える