【问题标题】:While inserting data via LINQ getting an exception: IDENTITY_INSERT is set to OFF通过 LINQ 插入数据时出现异常:IDENTITY_INSERT 设置为 OFF
【发布时间】:2016-09-14 01:25:48
【问题描述】:

这里有个小问题。调试了一个小时,ajax 传递数据,但是...我不能用 linq 将它放入数据库,因为错误

即使我确实有自动增量,它说它就像它关闭或什么的。 这是代码

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static int Save(int filmID, int rate)
{
    using (DataClassesDataContext du = new DataClassesDataContext())
    {
        du.ratings.InsertOnSubmit(new ratings
        {
            fk_film_id = filmID,
            rating_total = rate,
            rating_votes = 0
        });
        du.SubmitChanges();
}

数据库表:

CREATE TABLE [dbo].[ratings] 
(
    [fk_rating]    INT IDENTITY (1, 1) NOT NULL,
    [fk_film_id]   INT NOT NULL,
    [rating_total] INT NOT NULL,
    [rating_votes] INT NOT NULL,

    PRIMARY KEY CLUSTERED ([fk_rating] ASC),
    CONSTRAINT [FK_ratings_films] 
        FOREIGN KEY ([fk_film_id]) REFERENCES [dbo].[films] ([film_id])
);

这里的错误信息:

System.Data.Linq.dll 中出现“System.Data.SqlClient.SqlException”类型的异常,但未在用户代码中处理

附加信息:当 IDENTITY_INSERT 设置为 OFF 时,无法在表“ratings”中插入标识列的显式值。

我做错了什么?

@add 模型,但我这里并没有真正使用这种模式

private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);

private int _fk_rating;
private int _fk_film_id;
private int _rating_total;
private int _rating_votes;

private EntityRef<films> _film;

public ratings()
{
    this._film = default(EntityRef<films>);
    OnCreated();
}

[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_fk_rating", DbType="Int NOT NULL", IsPrimaryKey=true)]
public int fk_rating
{
    get { return this._fk_rating; }
    set 
    {
        if ((this._fk_rating != value))
        {
            this.Onfk_ratingChanging(value);
            this.SendPropertyChanging();
            this._fk_rating = value;
            this.SendPropertyChanged("fk_rating");
            this.Onfk_ratingChanged();
        }
    }
}

【问题讨论】:

  • 模型是如何映射的?
  • 您可能需要使用[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 属性。
  • @juharr 试过了,问题是 FkRating 在这种情况下没有使用。所以它不起作用。 @_ @
  • 您向我们展示了错误的模型。我们需要查看 EF 或 Linq-toSQL 模型,而不是您在 UI 或任何地方使用的模型。
  • 我认为自从将表添加到 .dbml 文件后,您已将主键更改为 IDENTITY INSERT。要检查这一点:打开 .dbml 文件,删除表,然后将其重新拖放到 .dbml 文件中并重新编译。

标签: c# sql-server linq


【解决方案1】:

您正在尝试将值显式插入到使用 IDENTITY 属性 fk_rating 定义的列中。此属性自动为插入的每条记录分配一个新的数字 ID。

你可以

A) 从列中删除标识属性并继续在插入中明确指定它的值。

B) 从插入语句中删除 Rating 值,并允许标识属性将 ID 分配给记录。

C) 将数据库表中的Identity_Insert 属性设置为ON(我不推荐这样做)

【讨论】:

  • 这并没有真正的帮助,因为 OP 没有创建 SQL,而是 Linq-provider 是。
  • 由于 Harugawa 在原始帖子中包含了 Create Table 语句,我假设他们有权对数据库进行 DDL 更改。如果他们无法更改正在传递的 SQL 语句,那么选项 A 或 C 应该可以解决问题。我不知道评级值是什么类型的数据,但我会根据字段名称假设此列上的 Identity 没有多大意义,因为它并不意味着是 ID 字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
  • 2015-10-18
  • 1970-01-01
相关资源
最近更新 更多