EntityFramework 6.0.0.0读取数据,但不插入

时间:2016-09-17 22:14:08

标签: c# wpf entity-framework entity-framework-6

我在WPF应用程序中创建了一个基于服务的数据库 folderName->Add New Item->Data->Service-based Database文件。然后我使用了Database First方法并创建了PersonsModel.edmx文件。这些操作完美执行。

数据读取正常

using (PersonDBEntities db = new PersonDBEntities())
{
   string dep = (db.Departament.FirstOrDefault()).DepName;//data can be read perfectly
   string bureau = (db.Bureau.FirstOrDefault()).BureauName;//data can be read perfectly 
}

但是,无法插入数据(此代码非常适用于其他项目):

using (PersonDBEntities db = new PersonDBEntities())
{
   try 
   {
      Departament dep = new Departament() { DepName = "NewDep" };
      db.Departament.Add(dep);
      db.SaveChanges();
   }
   catch(Exception ex)
   {
      string message = ex.Message;
   }                
 }

有人知道未插入数据的原因吗?

没有错误,例外,只是EF没有写数据。

upload a project to github,也许有趣的是看到:)。

用于创建表的SQL查询:

CREATE TABLE [dbo].[Departament] (
    [IdDep]   INT            IDENTITY (1, 1) NOT NULL,
    [DepName] NVARCHAR (100) NULL,
    PRIMARY KEY CLUSTERED ([IdDep] ASC)
);

和EF模型类:

public partial class Departament
{
    public Departament()
    {
        this.Person = new HashSet<Person>();
    }

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int IdDep { get; set; }
    public string DepName { get; set; }

    public virtual ICollection<Person> Person { get; set; }
}

Visual Studio 2013的控制台输出:

  

于2016年9月18日1:34:15 + 03:00开始交易

     

INSERT [dbo] .Departament VALUES(@ 0)SELECT [IdDep] FROM   [dbo]。[Departament] WHERE @@ ROWCOUNT&gt; 0和[IdDep] =   SCOPE_IDENTITY()

     

- @ 0:'311'(Type = String,Size = 100)

     

- 于2016年9月18日1:34:15 +03:00执行

     

- 在79毫秒内完成,结果为:SqlDataReader

     

承诺交易于18.09.2016 1:34:15 +03:00

     

于2016年9月18日1:34:15 +03:00关闭连接

如果我在Visual Studio 2013中将上述查询作为SQL数据库查询运行,那么它会完美地插入数据。

我按顺序尝试了以下方法:

//db.Departament.Add(dep);//not working
//db.Entry(dep).State = EntityState.Added;//not working
//db.Departament.Attach(dep);//not working
//db.Entry(dep).State = dep.IdDep == 0 ? EntityState.Added : EntityState.Modified;//not working
//db.Departament.Attach(dep);//not working
db.Entry(dep).State = EntityState.Modified;//not working

3 个答案:

答案 0 :(得分:3)

Special thanks to Magnus Montin as he has shown the mistake.我只是复制他的回答:

  

但是因为INSERT语句已经执行而且你没有得到任何声明   例外,您如何确认未插入数据?使   确定您正在寻找合适的数据库。那是数据库   它位于可执行文件(.exe)的输出文件夹中,   通常&#39; c:\ yourprojectfolder \ bin \ Debug \&#39;要么   &#39; C:\ yourprojectfolder \ BIN \发布\&#39 ;.这是数据的来源   默认编写。

我为避免这种行为而做的是我只写了数据库的绝对路径。现在它看起来像是:

<connectionStrings>   
    <add name="PersonDBEntities" connectionString="metadata=res://*/Model.PersonModel.csdl|res://*/Model.PersonModel.ssdl|res://*/Model.PersonModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;
      data source=(LocalDB)\v11.0;attachdbfilename=E:\Projects\WPF\EntityFrameworkCRUDDataGridWPF\EntityFrameworkCRUDDataGridWPF\AppData\EmployeeDB.mdf;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>

其他一些信息:

运行应用程序时(按F5或CTRL + F5),Visual Studio会将包括数据库MDF文件在内的所有文件复制到bin文件夹。 对所有文件进行所有更改数据库被复制到bin文件夹。

答案 1 :(得分:1)

设置IdDep列 [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 属性

public partial class Departament
{
    public Departament()
    {
        this.Person = new HashSet<Person>();
    }

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int IdDep { get; set; }
    public string DepName { get; set; }

    public virtual ICollection<Person> Person { get; set; }
}

答案 2 :(得分:1)

代码看起来很好;我认为唯一需要注意的是:

  • 连接字符串(确保正在更新的实体位于正确的数据库中;因为您使用的是LocalDB,请使用Server Explorer
  • 针对该特定数据库表执行ping操作
  • 请同时查看此答案 - https://stackoverflow.com/a/26343750/6830901并根据您要定位的SQL Server更新连接字符串。
  • 如果没有抛出EF异常(基于以上几点),下面的代码应该有效

        using (PersonDBEntities db = new PersonDBEntities())
        {
            try
            {
                Departament dep = new Departament() { DepName = "New Department" };
                db.Departament.Add(dep);
                db.SaveChanges();
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.Message);
            }
        }