2010-05-15 108 views
0

好的,这真的很奇怪。我用一个单一表格Customer做了一个简单的数据库,它有一个单列Name。从数据库I自动生成一个ADO.NET实体数据模型,和我想要一个新客户添加到它,像这样:无法使用实体框架更新数据库中的行...?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Test 
{ 
    class Program 
    { 
     static void Main() 
     { 
      Database1Entities db = new Database1Entities(); 
      Customer c = new Customer(); 
      c.Name = "Harry"; 
      db.AddToCustomer(c); 
      db.SaveChanges(); 
     } 
    } 
} 

但它不坚持客户“哈利”到数据库!我一直在挠头,现在想知道为什么这样一个简单的操作不起作用。究竟什么是问题!?

+0

没有主键?没有自动生成的标识列?尝试添加INT ID,身份,主键到您的表,以便EF有一个EntityKey。 – 2010-05-15 17:03:06

+0

名称是主键。但为了你的缘故,我尝试使用ID列作为主键,但这也不起作用! – Dissonant 2010-05-15 17:11:53

+0

如果你在一个try .... catch ....块中包装这个 - 你是否会遇到任何异常,如果是的话 - 什么异常? – 2010-05-15 20:37:19

回答

1

EF要求您有许多操作的唯一索引。

尝试将一个标识字段(主键)添加到您的表中。删除并重新创建模型,然后重试。

编辑:

它看起来像你从一个控制台应用程序运行这个。

  • 在app.config文件中是否有连接字符串?
  • 您的解决方案中是否有多个项目?
  • 你有没有例外?

EDIT2:

接下来的事情尝试:

  • 使用SQL Server Profiler来查看被发送到数据库
  • 打开EF模型在编辑器中看到XML ,检查是否有任何错误
+0

名称是主键。 :/ – Dissonant 2010-05-15 16:51:01

+0

但是Shiraz和Hightechrider认为添加一个int值为Indentity = Yes作为主键。这是一个最佳做法,它更优化: http://stackoverflow.com/questions/1603472/indexing-performance-bigint-vs-varchar – JohnB 2010-05-15 17:50:50

+0

我知道这是最佳做法。这只是一个简单的数据库测试。请看我对Hightechrider的回复。 并回答您的问题,设拉子: 是的。 编号 编号 – Dissonant 2010-05-16 11:35:57

0

db放在using声明中以确保连接/事务在进程退出之前完全关闭。

+0

不,也行不通。 :( – Dissonant 2010-05-15 16:58:08

0

好的,这是一个很长的画面。你是否确定你的连接字符串指向正确的地方?连接正在运行?

您可以通过使用SQL Server Management Studio中的一些记录添加到您的测试数据库验证它,然后像做

foreach (Customer c in db.Customers) 
{ 
    Console.WriteLine(c.Name); 
} 
相关问题