使用linq向sql插入多个子记录

时间:2012-06-09 16:53:15

标签: c# sql linq-to-sql

我正在创建一个轻弹的Web应用程序。

我有一个flickrUser表和一个flickrPhoto表

我已经插入了flickrUser记录,现在我想插入一些flickrPhoto记录;

FlickrPhoto:
 -photoid
 -flickruserid
 -id (PK)

这里是我试图插入flickrphoto记录的方式(flickrphoto存储在MyPhoto表中)

public void insertList(List<string> photoids, string flickruserid)
    {
        PicsPreciousLinqDataContext db = new PicsPreciousLinqDataContext();
        for (int i = 0; i < photoids.Count; i++)
        {              
                MyPhoto mf = new MyPhoto();
                mf.photoId = photoids[i];
                mf.source = "flickr";

                var query = from b in db.FlickrUsers
                            where b.nsid == flickruserid
                            select b;

                FlickrUser fUser = query.FirstOrDefault();
                mf.FlickrUserId = fUser.nsid;
                db.MyPhotos.InsertOnSubmit(mf);                
        }
        db.SubmitChanges();  <= Cannot add an entity with a key that is already in use.
    }

我已经尝试了一些变化,但也没有成功。插入多个子记录的正确方法是什么?

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

请检查您的 MyPhotos 表,我怀疑它有 userId 列作为主键。它应该是外键/引用键列。

添加以下内容代替您的代码,

 for (int i = 0; i < photoids.Count; i++)
    {              
            MyPhoto mf = new MyPhoto();
            mf.photoId = photoids[i];
            mf.source = "flickr";

            var query = from b in db.FlickrUsers
                        where b.nsid == flickruserid
                        select b;

            FlickrUser fUser = query.FirstOrDefault();
            mf.FlickrUserId = fUser.nsid;
            db.MyPhotos.Add(mf);               
    }
db.SubmitChanges();

答案 1 :(得分:1)

如果数据库设置的id值(即NEWID()为默认值或自动递增),则在dbml设计器中,单击作为主键的列,并确保以下属性具有这些值:

Auto Generated Value: True
Auto-Sync: OnInsert
Primary Key: True

如果数据库没有设置它,那么您必须为插入的每一行在C#代码中为Id列创建唯一值,而不是设置上面的前两个属性。

这可以通过以下方式完成:

 Guid.NewGuid();

所以在你的代码中:

PicsPreciousLinqDataContext db = new PicsPreciousLinqDataContext();
...
MyPhoto mf = new MyPhoto();
            mf.photoId = photoids[i];
            mf.source = "flickr";
            mf.id = Guid.newGuid();
...
db.MyPhotos.InsertOnSubmit(mf);  

表示数据库中uniqueIdentifier类型列的列。