Невозможно определить тип SQL для ... при создании таблиц с LinQ

1

Я получил следующий код:

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() я получаю следующую ошибку:

Не удалось определить тип SQL для 'tqOrder.data.TextbausteinTyp'

Строка Connection ведет к базе данных MSSQL, которая создается этим кодом (но без таблицы)

Что здесь происходит?

Теги:
linq
linq-to-sql

2 ответа

3
Лучший ответ

Не удалось определить тип SQL для 'tqOrder.data.TextbausteinTyp'

Я не удивлен, так как я не могу определить для него тип 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); }
}

Чтобы иметь другую сторону этого отображения; сбор объектов Textbaustein, которые связаны с этим конкретным TextbausteinTyp.

2

Ошибка пытается сказать вам, что LinqToSQL не может определить, какой тип SQL Server должен хранить объекты типа TextbausteinTyp.

LINQ to SQL не поддерживает пользовательские типы - только примитивные типы. Он соответствует типам CLR с определенным типом SQL Server, как определено здесь.

Тем не менее, я могу заключить, что вы пытаетесь определить связь между Textbaustein и TextbausteinTyp. Вы можете использовать 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();
        }
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню