我在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
答案 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="
data source=(LocalDB)\v11.0;attachdbfilename=E:\Projects\WPF\EntityFrameworkCRUDDataGridWPF\EntityFrameworkCRUDDataGridWPF\AppData\EmployeeDB.mdf;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" 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)
代码看起来很好;我认为唯一需要注意的是:
Server Explorer
如果没有抛出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);
}
}