Reputation: 11806
I have two linqTOsql entities that has a parent and child relationship, one to many. I'm running into an issue that when I retrieve the parent record, I am unable to loop through the related records in the child table.
This code fails:
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;
}
The error is:
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
I don't understand why the stacktrace is showing int32
. I'm 99% certain that I have been using long
and bigint
for all my IDs. Just to cover all my bases, heres the parent and child model code:
Parent:
[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); }
}
}
Child:
[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; }
}
}
What could be causing my cast exception?
StreamEntry Table:
seID bigint notnull
seUrl nvarchar(255) notnull
seHeadline nvarchar(255) notnull
seBody ntext nullable
seDescription nvarchar(255) nullable
seKeywords nvarchar(255) nullable
seTitle nvarchar(255) nullable
seOrder bigint notnull
seDateCreated datetime notnull
seDateModified datetime notnull
StreamID bigint notnull
AllowComents bit notnull
FieldInstance Table:
ftID bigint notnull
ftIsRequired bit notnull
ftLabel nvarchar(50) notnull
ftStrValue nvarchar(1000) nullable
ftDateTimeValue datetime nullable
ftIntValue int nullable
ftDecValue decimal(18,0) nullable
ftOrder bigint notnull
ftStreamEntryID bigint notnull --- FK to StreamEntry table
ftFieldTypeID bigint notbull
This code:
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;
}
Returns:
6
asd
asd
>
>
>
>
0
2010-11-16 4:10:45 PM
2010-11-16 4:10:45 PM
75
False
Upvotes: 3
Views: 1873
Reputation: 85126
Is it possible that you updated the column type in your underlying database without updating your DBML?
Upvotes: 3