我已经四处寻找:
How do I make my Linq to Sql entity implement INotifyPropertyChanged
这些答案并不令人满意。他们只是说添加一个主键,但我仍然不知道为什么我应该有一个实现INotifyPropertyChanged
,因为数据本身并不包含任何主键,这样我就可以使用关联/外键)。
在我尝试使用L2S设计器的过程中,我发现除非我为表提供主键,否则不会生成关联代码。
我期待一个答案,解释这种约束的原因,可能是深入的。
答案 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行?还是插入/删除和修改的组合?
简单的规则是,所有表都应始终具有主键。如果没有,则从所有列中生成主键,或生成唯一的自动增量列并使其成为主键。如果没有一行,除了行所包含的数据之外,你不能将一行与另一行分开,并且不能跟踪对它们的更改(如果有的话)。