C# Fluent NHibernate批量数据插入

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,

我需要将一些数据传输到其他数据库,但当我启动此mssql服务器时,数据冻结。 ds2行数约为250000。我做错了什么

每次我尝试同一个函数时,它首先看起来有效,然后在随机行上给出错误。可能是5、95或280。直到错误记录看起来有效

        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是一款非常棒的工具;)享受吧