实体框架- db.SaveChanges()错误
本文关键字:错误 SaveChanges db 框架 实体 | 更新日期: 2023-09-27 17:49:40
我正在使用实体框架创建一个数据库,并从我的模型和控制器写入它。我得到了一个错误的行"DB.SaveChanges();"。错误提示:"更新条目时发生错误。详情请参阅内部异常。"然后内部异常声明:"无效的对象名称'dbo.ContactModel'。"我已经看了所有的SO帖子有一个类似的问题,但似乎没有解决我的问题。我会张贴代码,我认为是相关的问题。如果还需要的话,请告诉我。
My ContactContext.cs class:
using newBestPlay.Models;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
namespace newBestPlay.DAL
{
public class ContactContext : DbContext
{
public ContactContext() : base("BestPlay")
{
}
public DbSet<ContactModel> Contacts { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}
}
和我的 这是控制器中的索引post方法: 我想这就足够了。如果需要更多代码,请告诉我。<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)'v11.0;AttachDBFilename=|DataDirectory|'Contacts.mdf;Initial Catalog=Contacts;Integrated Security=True" providerName="System.Data.SqlClient" />
<add name="BestPlay" connectionString="Data Source=(LocalDb)'v11.0;Integrated Security=True" providerName="System.Data.SqlClient" />
< /connectionStrings >
// POST: Contact/Index
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index([Bind(Include = "ID,name,address,city,state,zip,phone,fax,email,requestType,emailAlerts,message")] ContactModel contactModel)
{
if (ModelState.IsValid)
{
contactModel.name = ToTitleCase(contactModel.name);
contactModel.address = ToTitleCase(contactModel.address);
contactModel.city = ToTitleCase(contactModel.city);
db.Contacts.Add(contactModel);
db.SaveChanges();
TempData["Message"] = "Thank you for your input. If requested, we will contact you soon.";
return RedirectToAction("Index");
}
return View(contactModel);
}
所以我终于在Yuval Itzchakov的帮助下找到了它。我的表不存在,我认为实体框架应该自动为我创建它。但事实并非如此。实际失败的查询是:INSERT [dbo].[Contacts]([name], [address], [city], [state], [zip], [phone], [fax], [email], [requestType], [emailAlerts], [message])
VALUES (@0, @1, @2, @3, @4, @5, @6, @7, @8, @9, @10)
SELECT [ID]
FROM [dbo].[Contacts]
WHERE @@ROWCOUNT > 0 AND [ID] = scope_identity()
所以它试图在一个不存在的表上运行一个select。我发现我必须将这一行添加到构造函数中的ContactContext类中:
Database.SetInitializer<ContactContext>(new CreateDatabaseIfNotExists<ContactContext>());
成功了!
如果您要重写OnModelCreating
,则需要将映射传递给DbModelBuilder
,因为实体名称和数据库中的表不匹配:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Entity<ContactModel>().ToTable("Contacts");
}