【问题标题】:WP7 & Linq-To-SQL: SubmitChanges after query.toList() deletes items from dbWP7 和 Linq-To-SQL:Query.toList() 后 SubmitChanges 从数据库中删除项目
【发布时间】:2012-12-03 01:29:04
【问题描述】:

我想做最简单的事情——从数据库中获取数据。当我进行查询并稍后在 DataContext 对象上调用 SubmitChanges() 时,所有获取的项目都会从数据库中删除。代码如下:

SubmitChanges(); // nothing happened (it is OK)
List<Flashcard> list = (from f in FlashcardsTable
                        where f.Category.IsSelected
                              && !excluded.Contains(f.FlashcardId)
                        select f).ToList();
SubmitChanges(); // All items from list are deleting from DB!!

FlashcardsTable 是 DB 中的一个表,excluded 只是一个整数列表。

我的问题是为什么在调用 SubmitChanges() 时会删除数据库中的数据以及如何修复它(我想将数据留在数据库中)。


我仍在寻找我的问题的答案...这是我的代码中的更多详细信息,也许有帮助?

我在我的应用中做了两件事。首先创建 100 个项目并将它们放入 DB:

var db = new DbContext();
var flashcard = new Flashcard();
// here sets some fields on flashcard, not important...
for (var i = 0; i < 100; i++)
{
    var cat = db.CategoriesTable.First(c => c.CategoryId == categoryId);
    cat.Count++;
    flashcard.Category = cat;
    flashcard.BasketNr = 1;
    flashcard.TimeToCheck = Utils.CurrentDate.AddHours(12);
    db.FlashcardsTable.InsertOnSubmit(new Flashcard(flashcard));
}
db.SubmitChanges();

接下来我对 DB 进行查询:

var db = new DbContext();
db.SubmitChanges(); // here is OK, no SQL was generated
var a = (from f in db.FlashcardsTable
         where f.Category.IsSelected
         select f).ToList();
db.SubmitChanges(); // here are generated 100 SQLs deleting my data

调用第二个 db.SubmitChanges() 后会生成 100 个 SQL,例如:

DELETE FROM [Flashcard] WHERE [FlashcardId] = @p0

-- @p0: Input Int32 (Size = 4; Prec = 0; Scale = 0) [1]

-- Context: SqlProvider(SqlCE) Model: AttributedMetaModel Build: System.Data.Linq, Version=7.0.0.0, Culture=neutral, PublicKeyToken=24EEC0D8C86CDA1E

也许表格的定义是错误的?这里是:

[Table]
public class Category : INotifyPropertyChanged {

    public event PropertyChangedEventHandler PropertyChanged;

    private string name;
    [Column(IsPrimaryKey = true, IsDbGenerated = true, DbType = "INT NOT NULL Identity", CanBeNull = false, AutoSync = AutoSync.OnInsert)]
    public int CategoryId { get; set; }

    [Column(UpdateCheck = UpdateCheck.Never)]
    public string Name {
        get { return name; }
        set {
            if (name != value) {
                name = value;
                if (PropertyChanged != null) {
                    PropertyChanged(this, new PropertyChangedEventArgs("Name"));
                }
            }
        }
    }

    [Column(UpdateCheck = UpdateCheck.Never)]
    public int Count { get; set; }

    [Column(UpdateCheck = UpdateCheck.Never)]
    public bool IsSelected { get; set; }

}



[Table]
public class Flashcard {
    public const int TYPE_TEXT = 1;
    public const int TYPE_BITMAP = 2;

    [Column(IsPrimaryKey = true, IsDbGenerated = true, DbType = "INT NOT NULL Identity", CanBeNull = false, AutoSync = AutoSync.OnInsert)]
    public int FlashcardId { get; set; }

    [Column(UpdateCheck = UpdateCheck.Never)]
    public DateTime TimeToCheck { get; set; }

    [Column(CanBeNull = false, UpdateCheck = UpdateCheck.Never)]
    public int Type { get; set; }

    private byte[] firstPageBitmap;
    private byte[] secondPageBitmap;
    private string firstPageText;
    private string secondPageText;

    public Flashcard(Flashcard flashcard) {
        FirstPageBitmap = flashcard.FirstPageBitmap;
        SecondPageBitmap = flashcard.SecondPageBitmap;
        FirstPageType = flashcard.FirstPageType;
        SecondPageType = flashcard.SecondPageType;
        BasketNr = flashcard.BasketNr;
        Category = flashcard.Category;
        TimeToCheck = flashcard.TimeToCheck;
    }

    public Flashcard() {
    }

    [Column(DbType = "image", UpdateCheck = UpdateCheck.Never, CanBeNull = true)]
    public byte[] FirstPageBitmap {
        get { return firstPageBitmap; }
        set {
            FirstPageType = TYPE_BITMAP;
            firstPageBitmap = value;
        }
    }

    [Column(CanBeNull = true, UpdateCheck = UpdateCheck.Never)]
    public string FirstPageText {
        get { return firstPageText; }
        set {
            FirstPageType = TYPE_TEXT;
            firstPageText = value;
        }
    }

    [Column(UpdateCheck = UpdateCheck.Never)]
    public int FirstPageType { get; set; }

    [Column(UpdateCheck = UpdateCheck.Never)]
    public int SecondPageType { get; set; }

    [Column(DbType = "image", UpdateCheck = UpdateCheck.Never, CanBeNull = true)]
    public byte[] SecondPageBitmap {
        get { return secondPageBitmap; }
        set {
            SecondPageType = TYPE_BITMAP;
            secondPageBitmap = value;
        }
    }

    [Column(CanBeNull = true, UpdateCheck = UpdateCheck.Never)]
    public string SecondPageText {
        get { return secondPageText; }
        set {
            SecondPageType = TYPE_TEXT;
            secondPageText = value;
        }
    }

    [Column(UpdateCheck = UpdateCheck.Never)]
    public int BasketNr { get; set; }

    [Column(UpdateCheck = UpdateCheck.Never)]
    public int CatId { get; set; }

    [Association(ThisKey = "CatId", OtherKey = "CategoryId", IsForeignKey = true, DeleteOnNull = true)]
    public Category Category { get; set; }
}

有什么建议吗?

【问题讨论】:

    标签: c# windows-phone-7 linq-to-sql


    【解决方案1】:

    确保你告诉 Linq 你想分别对表格做什么

    FlashcardsTable.DeleteAllOnSubmit(list);
        SubmitChanges();
    

    这是删除所有这些的简单方法

    【讨论】:

    • 那么问题是他的数据正在从数据库中删除
    【解决方案2】:

    我 99.999999% 确信这是一个错误诊断的案例。

    也许您的数据确实已从数据库中删除,但我相信这不是因为这段代码。向我们展示真实代码(在此示例中,您没有数据上下文,因此是某种简化..)

    您可以分析生成的 sql 以检查其中是否存在删除。如果是这样,我将非常乐意为您的问题添加赏金。

    【讨论】:

    • 嗨。感谢重播。代码是真实的。没有datacontext,因为它是继承自DataContext(SubmitChanges() == this.SubmitChanges())的类的一个方法的一部分。我看了生成的sql。在第一次调用 SubmitChanges() 后没有生成 SQL。在第二次 SubmitChanges() 生成命令后,删除对象 od table Flashcard...
    • 好吧,我认为您应该阅读有关如何使用 Linq2Sql 的内容,因为我不认为您走在正确的轨道上。我从未见过从 DataContext 继承的类只是为了做 CRUD。您应该为工作单元动态创建它们...
    • 我创建了所有数据库人员的类,并且我从 DataContext 继承了它,因为在这种情况下它是简单的解决方案(我不需要一直创建 DataContext 对象,但仍然在 DataContext 的一个实例上工作 -这是个坏主意吗?)。我以为这个帖子是初学者的常见错误,但现在我发现它不是那么明显,我必须努力寻找解决方案......感谢回复
    【解决方案3】:

    我想通了。在更改关联 Flashcard->Category 的声明后,一切正常。正确的代码在这里:

    private EntityRef<Category> _categoryRef = new EntityRef<Category>();
    [Association(ThisKey = "CatId", OtherKey = "CategoryId", IsForeignKey = true, DeleteOnNull = true, Storage = "_categoryRef")]
    public Category Category
    {
        get { return _categoryRef.Entity; }
        set
        {
            if (_categoryRef.Entity != value || !_categoryRef.HasLoadedOrAssignedValue)
            {
                _categoryRef.Entity = value;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-14
      • 1970-01-01
      • 2013-05-01
      • 1970-01-01
      相关资源
      最近更新 更多