【问题标题】:Unable to determine SQL type for... when creating tables with LinQ使用 LinQ 创建表时无法确定...的 SQL 类型
【发布时间】:2014-05-28 08:59:14
【问题描述】:

我得到以下代码:

public class SqlData : DataContext
{
    public Table<TextbausteinTyp> TextbausteinTypen;
    public SqlData(string connectionString) : base(connectionString)    {      }

    public void CreateDb()
    {
       CreateDatabase();
    }
}
[Table(Name = "tqTextbausteinTyp")]
public class TextbausteinTyp
{
    [Column(IsPrimaryKey = true, DbType = "BigInt IDENTITY NOT NULL", IsDbGenerated = true, UpdateCheck = UpdateCheck.Never)]
    public int Id;
    [Column]
    public string Name;
}

[Table(Name = "tqTextbaustein")]
public class Textbaustein
{
    [Column(IsPrimaryKey = true, DbType = "BigInt IDENTITY NOT NULL", IsDbGenerated = true, UpdateCheck = UpdateCheck.Never)]
    public int Id;
    [Column]
    public TextbausteinTyp IdBausteintyp;
    [Column]
    public string Inhalt;
    [Column]
    public string Name;
}

如您所见,它非常简单。执行 CreateDatabase() 时收到以下错误:

无法确定“tqOrder.data.TextbausteinTyp”的 SQL 类型

连接字符串指向由此代码创建的 MSSQL 数据库(但没有表)

这里出了什么问题?

【问题讨论】:

  • DbType 不是枚举吗?我猜你不能给它分配一个字符串值。见msdn.microsoft.com/de-de/library/…
  • 您使用的是什么版本的 MSSQL Server?
  • 我走错了路 :) 导致错误的不是“TextbausteinTyp”类,而是另一个类/表中对该表/类的引用是错误的。我会更新我的问题,所以真正的错误部分会被发现..

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


【解决方案1】:

无法确定“tqOrder.data.TextbausteinTyp”的 SQL 类型

我并不感到惊讶,因为我也无法确定它的 SQL 类型。一个表如何成为另一个表中的列?

我想,但不能肯定,你真的想要这样的东西:

[Column(CanBeNull=false,DbType="int not null")]
public int IdBausteintyp;

为了有一个引用IdBausteintyp 列的外键列(我更愿意以“id”结尾而不是开头,但这是另一回事)。

您可以从该起点然后添加:

private EntityRef<TextbausteinTyp> _textbausteinTyp;
[Association(Storage = "_textbausteinTyp", ThisKey = "IdBausteintyp")]
public TextbausteinTyp TextbausteinTyp
{
    get { return _textbausteinTyp.Entity; }
    set { _textbausteinTyp.Entity = value; }
}

然后你有一个TextbausteinTyp 属性,它获取或设置一个与外键相关的TextbausteinTyp。 (注意,如果您只想在查询中根据需要显式加入,则不必这样做)。

同样,您可以选择添加到 TextbausteinTyp 类:

private EntitySet<Textbaustein> _textbausteins;
[Association(Storage = "_textbausteins", OtherKey = "IdBausteintyp")]
public EntitySet<Textbaustein> Textbausteins
{
    get { return _textbausteins; }
    set { _textbausteins.Assign(value); }
}

这样才能映射到此的另一侧;与特定 TextbausteinTyp 相关的 Textbaustein 实体的集合。

【讨论】:

    【解决方案2】:

    该错误试图告诉您 LinqToSQL 无法确定 SQL Server 类型应该存储 TextbausteinTyp 类型的对象。

    LINQ to SQL 不支持用户定义类型 - 仅支持原始类型。它将 CLR 类型与定义为 here 的特定 SQL Server 类型匹配。

    也就是说,我可以推断您正在尝试定义TextbausteinTextbausteinTyp 之间的关联。您可以使用 AssociationAttribute 来执行此操作。以下是有关如何执行此操作的修改后的代码示例。您可能需要反转关联。

    using System;
    using System.Data.Linq;
    using System.Data.Linq.Mapping;
    
    namespace LinqConsoleApp
    {
        public class SqlData : DataContext
        {
            public Table<TextbausteinTyp> TextbausteinTypen;
            public Table<Textbaustein> Textbausteins;
    
            public SqlData(string connectionString)
                : base(connectionString)
            {
            }
        }
    
        [Table(Name = "tqTextbausteinTyp")]
        public class TextbausteinTyp
        {
            [Column(IsPrimaryKey = true, DbType = "BigInt IDENTITY NOT NULL", IsDbGenerated = true, UpdateCheck = UpdateCheck.Never)]
            public int Id;
    
            [Column]
            public string Name;
        }
    
        [Table(Name = "tqTextbaustein")]
        public class Textbaustein
        {
            [Column(IsPrimaryKey = true, DbType = "BigInt IDENTITY NOT NULL", IsDbGenerated = true, UpdateCheck = UpdateCheck.Never)]
            public int Id;
    
            private EntityRef<TextbausteinTyp> _TextbausteinTyp;
    
            [Association(Storage = "_TextbausteinTyp", ThisKey = "Id")]
            public TextbausteinTyp IdBausteintyp;
    
            [Column]
            public string Inhalt;
    
            [Column]
            public string Name;
        }
    
        internal class Program
        {
            private static void Main(string[] args)
            {
    
                var builder = new System.Data.SqlClient.SqlConnectionStringBuilder();
                builder["Data Source"] = "<SERVERNAME>"
                builder["integrated Security"] = true;
                builder["Initial Catalog"] = "<DATABASE>";
    
                SqlData db = new SqlData(builder.ConnectionString);
    
                db.CreateDatabase();
                Console.ReadLine();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-08
      • 2016-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-11
      相关资源
      最近更新 更多