C# Fluent NHibernate批量数据插入
我需要将一些数据传输到其他数据库,但当我启动此mssql服务器时,数据冻结。 ds2行数约为250000。我做错了什么 每次我尝试同一个函数时,它首先看起来有效,然后在随机行上给出错误。可能是5、95或280。直到错误记录看起来有效C# Fluent NHibernate批量数据插入,c#,sql-server,nhibernate,fluent-nhibernate,C#,Sql Server,Nhibernate,Fluent Nhibernate,我需要将一些数据传输到其他数据库,但当我启动此mssql服务器时,数据冻结。 ds2行数约为250000。我做错了什么 每次我尝试同一个函数时,它首先看起来有效,然后在随机行上给出错误。可能是5、95或280。直到错误记录看起来有效 string inlineSql = "Select * from album"; DataSet ds2 = SqlHelper.ExecuteDataset(ConnectionString, CommandType.Text,
string inlineSql = "Select * from album";
DataSet ds2 = SqlHelper.ExecuteDataset(ConnectionString, CommandType.Text, inlineSql);
for (int i = 0; i < ds2.Tables[0].Rows.Count; i++)
{
Entity.Album.Album album = new Entity.Album.Album();
album.AlbumName = ds2.Tables[0].Rows[i]["AlbumName"].ToString();
album.WebSite = (Entity.Artist.WebSite)Convert.ToInt16(ds2.Tables[0].Rows[i]["WebSite"]);
album.Year = ds2.Tables[0].Rows[i]["Year"].ToString();
Entity.Artist.Artist artist = Entity.Artist.Artist.READ.ById(Convert.ToInt32(ds2.Tables[0].Rows[i]["ArtistId"]));
if (artist != null)
{
artist.AddAlbum(album);
album.Save();
}
}
保存方法
using (var session = NHibernateHelper.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
session.SaveOrUpdate(x);
transaction.Commit();
}
}
session.SaveOrUpdate(x)出错代码>
错误:
类型为“NHibernate.Exceptions.GenericadException”的异常
在NHibernate.dll中发生,但未在用户代码中处理
其他信息:无法插入:[Entity.Album.Album][SQL:
插入[相册]
(唱片名称、网站、年份、艺人)值(?、、、、?);选择
作用域\标识()]
相册地图
公共类相册映射:类映射
{
公共地图()
{
Id(x=>x.AlbumId);
Map(x=>x.name);
Map(x=>x.WebSite).CustomType();
Map(x=>x.Year);
HasMany(x=>x.LyricList).Table(“Lyric”).KeyColumn(“AlbumId”).Cascade.All().Not.LazyLoad();
引用(x=>x.Artist).Column(“ArtistId”).ForeignKey(“ArtistId”).Fetch.Join();
}
}
艺术地图
public class ArtistMap : ClassMap<Artist>
{
public ArtistMap()
{
Id(x => x.ArtistId);
Map(x => x.ArtistName);
Map(x => x.ArtistURL);
Map(x => x.ImgName);
Map(x => x.ImgURL);
Map(x => x.Alfabet);
Map(x => x.SeoLink);
Map(x => x.WebSite).CustomType<short>();
HasMany(x => x.AlbumList).Table("Album").KeyColumn("ArtistId").Cascade.All().Not.LazyLoad();
}
}
公共类ArtistMap:ClassMap
{
公共艺术地图()
{
Id(x=>x.ArtistId);
地图(x=>x.ArtistName);
地图(x=>x.ArtistURL);
Map(x=>x.ImgName);
Map(x=>x.ImgURL);
Map(x=>x.Alfabet);
Map(x=>x.SeoLink);
Map(x=>x.WebSite).CustomType();
HasMany(x=>x.AlbumList).Table(“Album”).KeyColumn(“ArtistId”).Cascade.All().Not.LazyLoad();
}
}
更多例外
INSERT语句与外键约束冲突
“FKA0CE20AA48AC4CAD”。数据库“LYRICSWEB”中发生冲突,
表“dbo.Artist”,第'ArtistId'列。声明已被修改
终止
有一些迹象表明,应该可以找到答案。我们可以看到错误是:
其他信息:无法插入:[Entity.Album.Album][SQL:插入到[Album]
(相册名称、网站、年份、ArtistId)值(?、、?、?);选择范围_标识()
当我们以正确的方式加载艺术家时
Entity.Artist.Artist artist = Entity.Artist.Artist.READ
.ById(Convert.ToInt32(ds2.Tables[0].Rows[i]["ArtistId"]));
问题将出现在不正确的集合映射中。从Albutt到Artist的引用似乎是正确的:
public AlbumMap()
{
..
References(x => x.Artist)
.Column("ArtistId")
.ForeignKey("ArtistId")
.Fetch.Join();
}
但该关系的另一端映射如下:
// wrong
public ArtistMap()
{
..
HasMany(x => x.AlbumList)
.Table("Album")
.KeyColumn("AlbumId") // wrong
.Cascade.All().Not.LazyLoad();
}
// correct
public ArtistMap()
{
..
HasMany(x => x.AlbumList)
.Table("Album")
.KeyColumn("ArtistId") // this is the relation
.Cascade.All()
.Not.LazyLoad()
.Inverse(); // ESSENTIAL improvement of generated SQL
}
上述两种关系都是相同的!它们仅从不同的端映射(从集合项透视图和集合所有者透视图)
这意味着映射列必须相同,即不是“AlbumId”
,而是“ArtistId”
// correct
public ArtistMap()
{
..
HasMany(x => x.AlbumList)
.Table("Album")
.KeyColumn("ArtistId") // this is the relation
.Cascade.All().Not.LazyLoad();
}
因为NHibernate加载了一些艺术家及其AlubmList收藏。。这可能会导致一些意外的insert语句。。。修复该映射将有助于
第二件要提到的事:Inverse()
我们正在使用Album
实例。。。我们正在将它们的关系分配给收藏持有者-艺术家
。这是一个很好的建议方法。好
但我们可以从名为Inverse()的NHibernate特性中获益,它将减少很少的SQL语句。。。并使所有的插入更加简单。。。因此,请按如下方式扩展艺术家贴图:
// wrong
public ArtistMap()
{
..
HasMany(x => x.AlbumList)
.Table("Album")
.KeyColumn("AlbumId") // wrong
.Cascade.All().Not.LazyLoad();
}
// correct
public ArtistMap()
{
..
HasMany(x => x.AlbumList)
.Table("Album")
.KeyColumn("ArtistId") // this is the relation
.Cascade.All()
.Not.LazyLoad()
.Inverse(); // ESSENTIAL improvement of generated SQL
}
查看更多详细信息请添加该异常的下一行,好吗?确实会有有趣的信息。。。提示:我们现在看到的似乎是,
albumId
列没有打开标识……这都是例外。AlbumId标识规范是的,我也在添加ClassMapah,我不知道还有更多,我发现现在添加完全异常。所以,我发现了一个问题(检查我的答案)。无论如何,这必须得到解决。。。但也许我们会面临其他问题。。让我知道。你对ArtistId的看法是对的,我修正了,也尝试了反向,但没有一个解决了错误。这些信息可能会有所帮助,每次我尝试相同的函数时,第一次看起来有效,然后在随机行上给出错误。可能是5、95或280。直到错误记录看起来有效。这种信息没有帮助;(…随机问题…不可预测…我可以帮助解决捕获的问题…如果你知道我的意思…尝试,请查找更多详细信息…再次,异常堆栈(如果是新异常,则最好是发出新问题,仅当异常完全不同时)但是,如果异常仍然是相同的-尝试比较表/db中ArtistId中的所有值…如果它们存在于目标表/dbI中,则删除相册表以使用新ArtistId和反向修复重新创建自己。现在似乎应用了更改。1000+行仍然没有错误!我认为ArtistId修复了它。非常感谢:)很高兴看到这一点,先生!NHibernate是一款非常棒的工具;)享受吧