为什么我不能在单个服务器请求中插入带有外键的记录?

时间:2010-05-24 08:06:57

标签: c# entity-framework .net-3.5

我正在尝试使用外键进行简单的插入,但似乎我需要对每个记录插入使用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。指定的值不是有效常量类型的实例 参数名称:值。

编辑:更改了示例代码并添加了返回的异常。

3 个答案:

答案 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);