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 中的每个表都必须有一个主键吗?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中的“每个派生表都必须有自己的别名”是啥错误?

MySQL中的“每个派生表都必须有自己的别名”是啥错误?

MySQL中的“每个派生表都必须有自己的别名”是啥错误?

比较 SQL Server CE 中的两个 Datetime 类型(“MMMM-yyyy”)

联合所有在 SQL Server 中的视图性能问题

SQL Server CE 中的 Shrink 和 Compact 有啥区别?