// Insert new record
ArtworkingDataContext dc = new ArtworkingDataContext();
tblArtworkData NewRecord = new tblArtworkData()
{
dateCreated = DateTime.Now,
templateID = TemplatesID,
userID = UsersID
};
dc.tblArtworkDatas.InsertOnSubmit(NewRecord);
// Set new values
this.Loaded = true;
this.ID = NewRecord.ID;
this.DateCreated = (DateTime)NewRecord.dateCreated;
this.TemplateID = (int)NewRecord.templateID;
this.UserID = (int)NewRecord.userID;
}
当我设置新值时,ID不需要转换,但其他人都需要转换,否则我得到:
Cannot implicitly convert type 'int?' to 'int'.
我已经厌倦了投出所有返回的数据,我做错了什么?为什么ID不需要演员?
答案 0 :(得分:6)
除了这里的所有其他答案之外 - 这可能表明数据库设计中的一个更大的问题是Linq to Sql Mapping。
您的对象显然希望始终提供这些值;但数据库列必须可以为空。如果表中的数据永远不会为null,那么你应该将它们设为NOT NULL,然后将设计器中的每个属性的'Nullable'属性设置为'false'
然后,您将不再需要演员或.HasValue
支票。
同样,您可以这样做而不是:
Value = nullable ?? default_Value;
default_Value
是某种哨兵整数 - 例如-1
或0
答案 1 :(得分:2)
您无需将int?
投射到int
,而只需在对象上使用.Value
(或者更确切地说,使用GetValueOrDefault()
扩展方法对你来说更安全)。该错误只是抱怨您将可空类型传递给不可为空的属性。
答案 2 :(得分:2)
似乎NewRecord.templateID
和NewRecord.userID
在C#中的类型为Nullable<int>
或int?
。
一个包装类,在这种情况下,Int32
为空。
ID字段可能在数据库中设置为“not null”。查看您的数据库架构,templateID和userID可能允许空值,这些空值将转换为Nullable<T>
类型。
答案 3 :(得分:2)
我做错了什么?
如果数据记录中的值是int?
类型,并且您填充的对象具有类型int
的属性,那么您做错的第一件事就是强制转换。而不是因为一直写(int)
很无聊。这样:
this.UserID = (int)NewRecord.userID;
当InvalidOperationException
包含NewRecord.userID
时,将抛出null
。在那里,现在无聊的东西以你不想要的方式变得令人兴奋。
对此有两种可能的回应:
“但这绝不会发生。”在这种情况下,修复创建NewRecord
的任何内容,使其属性不可为空。您可能会发现是的,实际上它可能会发生,因为数据库中的基础列可以为空。
“好的,因为数据库列可以为空,我猜它可能会发生。”在这种情况下,您需要找出为什么列可以为空。如果用户ID包含NULL,这意味着什么,以及应用程序应该做什么?您可能会发现需要创建本地对象的属性int?
而不是int
,然后包含处理其值为空的情况的逻辑。
很多人建议你使用null合并运算符或其他一些分配默认值的方法。有时这是一个好主意 - 如果你知道空值应该是什么意思。但是使用??
分配哨兵值的想法并没有真正解决问题,而是将已经完全可服务的哨兵值 - null
- 改为只有在可以的情况下才有效的值。 t自然地出现在价值空间中。有时您必须这样做 - 例如,如果您正在谈论一些不支持空值的代码 - 但这是您应该非常不情愿地做的事情。
答案 4 :(得分:1)
你必须检查可以为空的值是否有值。
int x;
int? nullable;
if(nullable.HasValue)
x = nullable;
原因是int!= int?
INT?
只是一个简短的表格
Nullable<int>
答案 5 :(得分:1)
我猜这些字段在数据库中是Nullable。
由于数据可能为空,因此C#将这些数据映射到Nullable数据字段 - 例如int?
(这是Nullable<int>
的简写)
您应该使用.HasValue
检查null,然后使用.Value
属性 - 或者您可以使用null合并运算符 - ??
如果你想避免这种转换,那么我能想到的唯一方法是更改数据库,使这些字段不能为空(也可能为它们提供默认值)
您的ID字段在数据库中不可为空 - 因此它在您的C#中表示为int
而不是int?
希望有所帮助
斯图尔特
答案 6 :(得分:1)
您需要this.DateCreated = NewRecord.dateCreated.GetValueOrDefault();
答案 7 :(得分:1)
我不认为这与Linq有关。编译器告诉您Nullable<T>
和T
之间没有隐式转换。显然,对于正常值,演员很容易。但如果dateCreated
为null
答案 8 :(得分:1)
TemplateID和UserID不是int System.Nullable<int>
,这就是你必须强制转换它们的原因。制作this.TemplateId和This.UserID Nullable<int>
或者在Nullable对象上使用.Value属性。