Я получил следующий код:
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, которая создается этим кодом (но без таблицы)
Что здесь происходит?
Не удалось определить тип 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
.
Ошибка пытается сказать вам, что 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();
}
}
}