У меня есть две сущности linqTOsql, которые имеют родительские и дочерние отношения, один ко многим.Я сталкиваюсь с проблемой, что, когда я получаю родительскую запись, я не могу перебрать связанные записи в дочерней таблице.
Этот код завершается ошибкой:
public string test()
{
string output;
StreamEntry entry = genesisRepository.StreamEntries.FirstOrDefault(x => x.seID == 6);
output = entry.seUrl.ToString() + "<br />";
foreach(var item in entry.FieldInstance)
{
output = "<ul>";
output += "<li>" + item.fiLabel.ToString() + "</li>";
output = "</ul>";
}
return output;
}
Ошибкаэто:
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.InvalidCastException: Specified cast is not valid.
Source Error:
Line 230:
Line 231: output = entry.seUrl.ToString() + "<br />";
Line 232: foreach(var item in entry.FieldInstance)
Line 233: {
Line 234:
Source File: C:\pathtoscript.cs Line: 232
Stack Trace:
[InvalidCastException: Specified cast is not valid.]
System.Data.SqlClient.SqlBuffer.get_Int32() +5002837
System.Data.SqlClient.SqlDataReader.GetInt32(Int32 i) +38
Read_FieldInstance(ObjectMaterializer`1 ) +1993
System.Data.Linq.SqlClient.ObjectReader`2.MoveNext() +32
System.Data.Linq.EntitySet`1.Load() +124
System.Data.Linq.EntitySet`1.GetEnumerator() +13
Я не понимаю, почему трассировка стека показывает int32
.Я на 99% уверен, что я использовал long
и bigint
для всех моих идентификаторов.Просто чтобы покрыть все мои базы, вот код модели родителя и потомка:
Родитель:
[Table]
public class StreamEntry
{
[HiddenInput(DisplayValue = false)]
[Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)]
public long seID { get; set; }
/* other fields removed for brevity */
// 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); }
}
}
Дочерний элемент:
[Table]
public class FieldInstance
{
[Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)]
public long fiID { get; set; }
/* Other field removed for brevity */
[Column]
public long fiStreamEntryID { get; set; } // FK
// Relationship (many FieldInstances to one StreamEntry)
// using EntityRef<StreamEntry> and ThisKey
// which is "This" table's FK
private EntityRef<StreamEntry> _StreamEntry;
[System.Data.Linq.Mapping.Association(Storage = "_StreamEntry", ThisKey = "fiStreamEntryID")]
public StreamEntry StreamEntry
{
get { return this._StreamEntry.Entity; }
set { this._StreamEntry.Entity = value; }
}
}
Что может быть причиной моего исключения приведения?
Редактировать - добавить определения таблиц
Таблица StreamEntry:
seID bigint notnull
seUrl nvarchar (255) notnull
seHeadline nvarchar (255) notnull
seBody ntext nullable
seDescription nvarchar (255) nullable
seKeywords nvarchar (255) nullable
searitle nitle) nullable
seOrder bigint notnull
seDateCreated datetime notnull
seDateModified datetime notnull
StreamID bigint notnull
AllowComents bit notnull
1050 *
Таблица FieldInstance:
ftID bigint notnull
ftIsRequired bit notnull
ftLabel nvarchar (50) notnull
ftStrValue nvarchar(1000) обнуляемый
ftDateTimeValue datetime обнуляемый
ftIntValue int nullable
ftDecValue decimal (18,0) nullable
ftOrder bigint notnull
ftStreamEntryID bigint notnull --- таблица FK для StreamEntry
ftFieldTypeID bigint notbull
Редактировать - добавлена запись StreamEntry
Этот код:
public string test()
{
string output;
StreamEntry entry = genesisRepository.StreamEntries.FirstOrDefault(x => x.seID == 6);
output = entry.seID.ToString() + "<br />";
output += entry.seUrl + "<br />";
output += entry.seHeadline + "<br />";
output += entry.seBody + "<br />";
output += entry.seDescription + "<br />";
output += entry.seKeywords + "<br />";
output += entry.seTitle + "<br />";
output += entry.seOrder.ToString() + "<br />";
output += entry.seDateCreated.ToString() + "<br />";
output += entry.seDateModified.ToString() + "<br />";
output += entry.StreamID.ToString() + "<br />";
output += entry.AllowComments.ToString() + "<br />";
return output;
}
Возвращает:
6
asd
asd
>
>
>
>
0
2010-11-16 16:10:45
2010-11-16 16:10:45
75
False