LINQ to SQL:为什么INotifyPropertyChanged需要主键?

时间:2015-09-01 15:24:46

标签: c# linq

我已经四处寻找:

How do I make my Linq to Sql entity implement INotifyPropertyChanged

LINQ-to-SQL class doesn't implement INotifyPropertyChanging & INotifyPropertyChanged if pulling from local database

这些答案并不令人满意。他们只是说添加一个主键,但我仍然不知道为什么我应该有一个实现INotifyPropertyChanged,因为数据本身并不包含任何主键,这样我就可以使用关联/外键)。

在我尝试使用L2S设计器的过程中,我发现除非我为表提供主键,否则不会生成关联代码。

我期待一个答案,解释这种约束的原因,可能是深入的。

1 个答案:

答案 0 :(得分:2)

简单的答案是,如果没有主键,数据库将无法识别具有相同确切数据的两个记录中的更改。如果你只更改了两个中的一个怎么办?这些类型的问题很可能是一个约束。如果原始表格如下所示,您希望生成哪些类型的事件:

$ echo -e "for fgets\nls"
for fgets
ls
$ gcc foo.c -o foo
$ echo -e "for fgets\nls" | ./foo
for fgets
Desktop    Downloads  foo.c  Pictures  Steam      Videos
Documents  foo        Music  Public    Templates  win

然后在下一次传递时,表格看起来像这样:

col1 col2 col3
test test test

这是对第一个记录的第二列的修改,还是删除一行并插入一行?

更复杂:

col1 col2 col3
test test2 test

为:

col1 col2 col3
test test test
test test test

这会修改row1的col1,col2,col3字段以及修改row2的col1和col2字段吗?或者它是对row1的col1和col2字段的修改,以及对row2的col1,col2,col3字段的修改?或者是删除了两行,插入了2行?还是插入/删除和修改的组合?

简单的规则是,所有表都应始终具有主键。如果没有,则从所有列中生成主键,或生成唯一的自动增量列并使其成为主键。如果没有一行,除了行所包含的数据之外,你不能将一行与另一行分开,并且不能跟踪对它们的更改(如果有的话)。