SQL Server CE 中的每个表都必须有一个主键吗?
Posted
技术标签:
【中文标题】SQL Server CE 中的每个表都必须有一个主键吗?【英文标题】:Is it necessary that every table in SQL Server CE must have a primary key? 【发布时间】:2015-02-23 05:34:37 【问题描述】:我正在创建一个简单的 windows phone 8 应用程序。为了在本地存储数据,我使用 Microsoft 的 ORM LINQ TO SQL。我假设它使用 Microsoft 提供的本机数据库 SQL Server CE。我已经定义了一个存储州名及其首都的表。
[Table]
public class State : INotifyPropertyChanged, INotifyPropertyChanging
private string _name;
public State(string name, string capital)
this.Name = name;
this.Capital = capital;
[Column]
public string Name
get
return _name;
set
if (_name != value)
NotifyPropertyChanging("Name");
_name = value;
NotifyPropertyChanged("Name");
private string _capital;
[Column]
public string Capital
get
return _capital;
set
if (_capital != value)
NotifyPropertyChanging("Capital");
_capital = value;
NotifyPropertyChanged("Capital");
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
// Used to notify the page that a data context property changed
private void NotifyPropertyChanged(string propertyName)
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
#endregion
#region INotifyPropertyChanging Members
public event PropertyChangingEventHandler PropertyChanging;
// Used to notify the data context that a data context property is about to change
private void NotifyPropertyChanging(string propertyName)
if (PropertyChanging != null)
PropertyChanging(this, new PropertyChangingEventArgs(propertyName));
#endregion
我也定义了DataBase Context 类。
public class DbDataContext : DataContext
// Specify the connection string as a static, used in main page and app.xaml.
public static string DBConnectionString = "Data Source=isostore:/ToDo.sdf";
// Pass the connection string to the base class.
public DbDataContext(string connectionString): base(connectionString)
// Specify a single table for the to-do items.
public Table<State> State_table;
现在,当我尝试在 MainPage 类的构造函数中插入一行时,它会抛出一个异常“System.InvalidOperationException”。
public MainPage()
InitializeComponent();
State temp = new State("Maharashtra", "Mumbai");
dbobj = new DbDataContext(DbDataContext.DBConnectionString);
dbobj.State_table.InsertOnSubmit(temp); //This where it generates an exception
dbobj.SubmitChanges();
但是当我将“状态”类中的属性“名称”重新定义为
[Column(IsPrimaryKey = true )]
public string Name
然后它不会抛出异常。 谁能告诉我为什么会这样?
谢谢!
【问题讨论】:
任何关系数据库中的每个表都应该有一个主键 - 它必须有一些东西才能让你唯一可靠地识别每一行! 这就是 RA 理论在 SQL 中不成立的地方。在各种关系数据库实现(例如 SQL Server;无论如何,非CE)..如何将其与RA操作一起使用是另一回事..@ 987654321@(但这个问题询问标题中的“CE”中是否“必需”..此外,可能有一个或多个 CK不是“PK”,但许多 ORM 在完全 RA 支持下是“哑”的。) 【参考方案1】:是的,每个表都需要有一个主键,以便可以唯一标识每一行。
还建议添加一个 Version 列,它可以显着加快 db 的性能:
[Column(IsVersion = true)]
#pragma warning disable 169
private Binary version;
【讨论】:
以上是关于SQL Server CE 中的每个表都必须有一个主键吗?的主要内容,如果未能解决你的问题,请参考以下文章