我有一组可以添加到数据库的可相关实体,但似乎需要进行一些转换.谁能指出我正确的方向?bool InsertDetails(DataTable detailTable, string fileName){using (SunseapEBTContext context = new SunseapEBTContext()...
我有一组可以添加到数据库的可相关实体,但似乎需要进行一些转换.谁能指出我正确的方向?
bool InsertDetails(DataTable detailTable, string fileName)
{
using (SunseapEBTContext context = new SunseapEBTContext())
{
if (InsertMaster(fileName))//if creating master record successful
{
int masterId = GetSPReadingM(m => m.FileName == fileName).SPReadingMasterId; //get MasterID of file uploaded
var details = detailTable.AsEnumerable().Select(row => new LeasingSPReadingDetailEntity()//new entity from datatable
{
//SPReadingId = row.Field<long>("ProductID"),
SPReadingMasterId = masterId,
BillCycleYear = int.Parse(row.Field<int>("Bill Cycle").ToString().Substring(0, 4)),
BillCycleMonth = byte.Parse(row.Field<byte>("Bill Cycle").ToString().Substring(4))
});
foreach(IEnumerable<LeasingSPReadingDetailEntity> detail in details)
{
context.LeasingSPReadingDetailEntities.AddObject(detail);
}
context.SaveChanges();
}
return true;
}
}
在foreach循环中,抛出异常
CS1503 Argument 1: cannot convert from ‘System.Collections.Generic.IEnumerable’ to ‘SunseapEBT.Domain.BillingModule.LeasingContract.Entity.LeasingSPReadingDetailEntity’
LeasingSPReadingDetailEntity类:
public class LeasingSPReadingDetailEntity
{
public long SPReadingId { get; set; }
public int SPReadingMasterId { get; set; }
public int BillCycleYear { get; set; }
public byte BillCycleMonth { get; set; }
}
更多信息:
将上载包含详细信息的文件,并在一个表中创建主记录.文件中的详细信息将使用第一个表中自动生成的masterId添加到单独的表中.问题是无法将详细信息添加到数据库中.
编辑:
我发现了为什么会出错.该错误是由于文件的内容.某些行没有输入值,最后一行没有遵循其余行的格式,因为它显示了总行数.谢谢大家的帮助!
解决方法:
@slawekwin评论是答案.但我认为有一个更好的解决方案,因为看起来你的代码迭代2x:1st生成新的Enumerable(浪费内存),2nd将对象添加到上下文.
当您迭代每一行时,也可以直接添加对象.
foreach(var row in detailTable.AsEnumerable())
{
context.LeasingSPReadingDetailEntities.AddObject(
new LeasingSPReadingDetailEntity()//new entity from datatable
{
//SPReadingId = row.Field<long>("ProductID"),
SPReadingMasterId = masterId,
BillCycleYear = int.Parse(row.Field<string>("Bill Cycle").Substring(0, 4)),
BillCycleMonth = byte.Parse(row.Field<string>("Bill Cycle").Substring(4)),
AccountNumber = row.Field<string>("Account No."),
PeriodStart = row.Field<DateTime>("Period Start"),
PeriodEnd = row.Field<DateTime>("Period End"),
TownCouncil = row.Field<string>("Customer Name"),
Service = row.Field<string>("Service Type"),
Adjustment = row.Field<string>("Adjustment"),
Block = row.Field<string>("Blk"),
AddressLine1 = row.Field<string>("Adress Line 1"),
AddressLine2 = row.Field<string>("Adress Line 2"),
AddressLine3 = row.Field<string>("Postal Code"),
Usage = row.Field<decimal>("Usage"),
Rate = row.Field<decimal>("Rate"),
Amount = row.Field<decimal>("Amount")
}
);
}
—编辑—
我不确定,但我可以猜测“Bill Cycle”字段既不是int也不是byte.因此,您应该将其作为字符串检索,然后将其解析为新对象.这是我改变的部分:
BillCycleYear = int.Parse(row.Field<string>("Bill Cycle").Substring(0, 4)),
BillCycleMonth = byte.Parse(row.Field<string>("Bill Cycle").Substring(4)),
本文标题为:c# – 如何从IEnumerable集合中将对象添加到数据库?
基础教程推荐
- C#实现观察者模式(Observer Pattern)的两种方式 2023-07-04
- .NETCore在析构函数(Finalize)在Linux下引起程序异常退出现象 2023-09-26
- C#中把Json数据转为DataTable 2023-06-04
- C# wpf简单颜色板的实现 2023-05-06
- C#实现飞行棋游戏 2023-04-22
- C#二进制读写BinaryReader、BinaryWriter、BinaryFormatter 2023-06-14
- C# WPF实现的语音播放自定义控件 2023-04-10
- C#在Windows窗体控件实现内容拖放(DragDrop)功能 2023-06-09
- Unity3D生成一段隧道网格的方法 2023-03-09
- C# String字符串案例详解 2023-04-22