简体   繁体   中英

Using DeleteAllOnSubmit when the table has no primary key

I am trying to delete records from a DB which has no primary key. The following works:

using (myDataContext db = new myDataContext ())
{
    db.ExecuteCommand("DELETE FROM myTable WHERE TradeDate = {0}", date);
}

(where date is an input to the function). But when I try convert it to LINQ

using (myDataContext db = new myDataContext ())
{
    db.myTable.DeleteAllOnSubmit(db.myTable.Where(t => t.TradeDate.Date == date.Date));
    db.SubmitChanges();
}

I get the following error because the table doesn't have a primary key:

Additional information: Can't perform Create, Update, or Delete operations on 'Table(myTable)' because it has no primary key.

I found the following old posts about this issue

DB:4.44:Dml Operations Using Linq Query For A Table Without Primary Key zm

Dml Operations using linq query for a table without primary key.

But I don't understand how to implement the fix they suggest (ie setting another key to IsPrimary ).

Is there a way to do this using LINQ? Bear in mind that adding a PK to the actual SQL table is not an option (unless I just add a row counting identity column).

Without a primary key the two interfaces aren't emitted: INotifyPropertyChanging and INotifyPropertyChanged and so LINQ to SQL doesn't know that your record has changed. Do the following:

  1. Open the LINQ Designer.
  2. Open the properties window for the table you want to delete a record from.
  3. Click on any of the columns in the entity you want to delete and you'll see a property labeled "Primary Key".
  4. Change the value to true for column you want to use as a primary key.

Please, use the unique column as a Primary Key in the EF model.

Otherwise use DataContext.ExecuteCommand()

As others have pointed, you need to add a primary key to your table. And then execute the query.

Else you can try to delete the row manually like this:

var query = myTable.AsEnumerable().Where(r => r.Field<Date>("TradeDate") == date.Date);

foreach(var row in query.ToList())
   row.Delete();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM