Linq 为什么我会得到重复的行插入?

Linq 为什么我会得到重复的行插入?,linq,windows-phone-7,sql-server-ce,Linq,Windows Phone 7,Sql Server Ce,我有WindowsPhone7应用程序和数据库映射类。 民意测验类如下所示: [Table] public class Poll // :BaseModel { //private int _pid; //private string _pdesc; //private bool _pisopen; //private string _pname; //private bool _prandom; //private string _qla

我有WindowsPhone7应用程序和数据库映射类。 民意测验类如下所示:

    [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;
    }
保存方法如下所示:

    [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;
    }
public bool行存储(IEnumerable实体,输出字符串错误)
{
error=string.Empty;
布尔雷斯;
var类型=类型(T);
使用(var ctx=新的PpaDataContext(_connectionString))
{
尝试
{
var entitesInDb=ctx.GetTable(type.Cast().ToList();
var entitesForSave=新列表();
foreach(实体中的var实体)
{
如果(!entitesInDb.Contains(实体))
{
entitesForSave.Add(实体);
}
其他的
{
var指数=实体Indb.IndexOf(实体);
foreach(PropertiesGet(实体)中的var prop)
{
prop.SetValue(entitesInDb[index],prop.GetValue(entity,null),null);
}
}
}
如果(entitesForSave.Count>0)
{
GetTable(type).InsertAllOnSubmit(entitesForSave);
}
ctx.SubmitChanges();
res=真;
}
捕获(例外情况除外)
{
错误=string.Format(“{0}”,例如Message);
res=假;
}
}
返回res;
}
当我尝试插入时,每个对象插入两次。此代码中有什么错误?
RowsSave方法只能调用一次

我认为你不需要排队:

ctx.SubmitChanges();
ctx.GetTable(type).InsertAllOnSubmit(entitesForSave); 
在线路上进行插入时:

ctx.SubmitChanges();
ctx.GetTable(type).InsertAllOnSubmit(entitesForSave); 

这有点离题,但我遇到了完全相同的问题。这与重写的相等运算符中的错误有关。在这种特定情况下,出现问题的原因是代码没有返回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在插入后使用对象相等比较。我不确定发生这种情况的上下文和原因,但如果比较返回false,它将再次运行插入。如果您遇到相同的行为,请检查实体的任何重写的相等方法是否正确。

InsertAllOnSubmit不会插入任何行