【问题标题】:error "data types ntext and nvarchar are incompatible" on SubmitChangesSubmitChanges 上的错误“数据类型 ntext 和 nvarchar 不兼容”
【发布时间】:2010-11-17 18:40:26
【问题描述】:

我最近在尝试更新预先存在的记录时开始收到此错误:

数据类型 ntext 和 nvarchar 在等于运算符中不兼容。

说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详情:System.Data.SqlClient.SqlException:数据类型 ntext 和 nvarchar 在等于运算符中不兼容。

来源错误:

第 108 行:streamEntryTable.Context.Refresh(RefreshMode.KeepCurrentValues, entry);

第 109 行:}

第 110 行:streamEntryTable.Context.SubmitChanges();

源文件:C:\Path\Genesis.Domain\Concrete\SqlGenesisRepositoryEntryPartial.cs 行:110

堆栈跟踪: [SqlException (0x80131904): 数据类型 ntext 和 nvarchar 在等于运算符中不兼容。]

什么会触发这样的比较?我之前已经能够在此表上执行 CRUD 功能。

什么会触发这种比较?

编辑

用于 linqTOsql 的 C# POCO:

[Table]
public class StreamEntry
{
    [HiddenInput(DisplayValue = false)]
    [Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)]
    public long seID { get; set; }

    [Required(ErrorMessage = "Please enter an entry URL.")]
    [Column]
    public string seUrl { get; set; }

    [Required(ErrorMessage = "Please enter an entry headline.")]
    [Column]
    public string seHeadline { get; set; }
    [Column]
    public string seBody { get; set; }
    [Column]
    public string seDescription { get; set; }
    [Column]
    public string seKeywords { get; set; }
    [Column]
    public string seTitle { get; set; }
    [Column]
    public long seOrder { get; set; }
    [Column]
    public DateTime seDateCreated { get; set; }
    [Column]
    public DateTime seDateModified { get; set; }
    [Column]
    public long StreamID { get; set; } // FK
    [Column]
    public bool AllowComments { get; set; }

    // Relationship (many entries to one stream)
    // using EntityRef<Stream> and ThisKey
    // which is "This" table FK
    private EntityRef<Stream> _Stream;
    [System.Data.Linq.Mapping.Association(Storage = "_Stream", ThisKey = "StreamID")]
    public Stream Stream
    {
        get { return this._Stream.Entity; }
        set { this._Stream.Entity = value; }
    }

    // relationship (one entry to many FieldInstances) 
    // uses EntitySet<FieldInstance> and OtherKey for the FK in FieldInstance 
    // which is the "Other" table.
    private EntitySet<FieldInstance> _FieldInstance = new EntitySet<FieldInstance>();
    [System.Data.Linq.Mapping.Association(Storage = "_FieldInstance", OtherKey = "fiStreamEntryID")]
    public EntitySet<FieldInstance> FieldInstance
    {
        get { return this._FieldInstance; }
        set { this._FieldInstance.Assign(value); }
    }

}

StreamEntry 表定义

seID bigint notnull

seUrl nvarchar(255) notnull

seHeadline nvarchar(255) notnull

seBody ntext 可为空

seDescription nvarchar(255) 可为空

seKeywords nvarchar(255) 可以为空

setTitle nvarchar(255) 可以为空

seOrder bigint notnull

seDateCreated 日期时间不为空

seDateModified 日期时间不为空

StreamID bigint notnull

AllowComments 位不为空

Edit2 - 有关错误的更多详细信息

如果seBody 表单字段为空,我可以成功SubmitChanges()。如果我向seBody 添加文本,它将正确更新。但是,从那时起,任何对SubmitChanges() 的尝试都会返回上述错误。

【问题讨论】:

  • 表架构有变化吗?听起来您的一种字段类型已更改。
  • 你的查询和表结构是什么?
  • @leppie:请进一步解释...
  • @Coding Gorilla - 是的......数据库中的表发生了变化,linq 正在使用的 POCO 表对象也发生了变化......但这些变化反映在数据库和 C# 代码中。
  • LINQ-to-SQL (AFAIK) 不支持“POCO”,所以我不确定您是否只是在混合您的术语。但这听起来确实有些不同步。虽然没有看到一些代码和模型,但很难说。

标签: c# sql-server linq-to-sql


【解决方案1】:

感谢您在我的问题的 cmets 中进行的所有讨论和信息。初步解决方案是将ntext 字段更改为nvarchar(MAX) 字段。这解决了所有的错误。这并不意味着一旦我弄清楚如何使用 l2sprof.com 之类的工具来查看生成的 SQL,我就不会重新讨论这个问题。

但是,暂时使用nvarchar(MAX)解决了这个问题。

【讨论】:

  • 如果您确实需要使用文本数据进行查找/搜索/等,这是正确的方法。
猜你喜欢
  • 2014-02-13
  • 2022-12-14
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多