我正在创建一个轻弹的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.
}
我已经尝试了一些变化,但也没有成功。插入多个子记录的正确方法是什么?
感谢任何帮助。
答案 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类型列的列。