我正在尝试使用外键进行简单的插入,但似乎我需要对每个记录插入使用db.SaveChanges()
。如何在此计划结束时只设法使用一个db.SaveChanges()
?
public static void Test()
{
using (var entities = new DBEntities())
{
var sale =
new SalesFeed
{
SaleName = "Stuff...",
};
entities.AddToSalesFeedSet(sale);
var phone =
new CustomerPhone
{
CreationDate = DateTime.UtcNow,
sales_feeds = sale
};
entities.AddToCustomerPhoneSet(phone);
entities.SaveChanges();
}
}
运行上面的代码后,我得到了这个例外:
System.Data.UpdateException:更新条目时发生错误。有关详细信息,请参阅InnerException。指定的值不是有效常量类型的实例 参数名称:值。
编辑:更改了示例代码并添加了返回的异常。
答案 0 :(得分:15)
显然使用UNSIGNED BIGINT
会导致此问题。当我切换到SIGNED BIGINT
时,一切都按预期工作。
答案 1 :(得分:2)
我试图以“正确的方式”做到这一点:
alt text http://i45.tinypic.com/mcw5co.png
然后我编写了这个小测试应用程序来扫描目录,将目录及其所有文件存储在两个表中:
static void Main(string[] args)
{
string directoryName = args[0];
if(!Directory.Exists(directoryName))
{
Console.WriteLine("ERROR: Directory '{0}' does not exist!", directoryName);
return;
}
using (testEntities entities = new testEntities())
{
StoredDir dir = new StoredDir{ DirName = directoryName };
entities.AddToStoredDirSet(dir);
foreach (string filename in Directory.GetFiles(directoryName))
{
StoredFile stFile = new StoredFile { FileName = Path.GetFileName(filename), Directory = dir };
entities.AddToStoredFileSet(stFile);
}
try
{
entities.SaveChanges();
}
catch(Exception exc)
{
string message = exc.GetType().FullName + ": " + exc.Message;
}
}
}
正如你所看到的,我在最后只有一次呼叫.SaveChanges()
- 这就像一个魅力,一切都如预期的那样。
关于你的方法的一些事情必须搞砸EF系统......
答案 2 :(得分:0)
它可能与AddToSalesFeedSet等的实现有关。 您是否有可能在内部进行提交?
无论如何,我的意思是我遇到了一个非常接近的问题,试图将关系添加到具有先前查询的存在实体的新实体的关系中-该实体具有未签名的键 并得到了相同的例外;
解决方案是调用Db.collection.Attach(previouslyQueriedEntityInstance);