实体框架 - db.SaveChanges()出错

时间:2015-05-19 13:17:06

标签: c# asp.net-mvc entity-framework

我正在使用Entity Framework创建一个数据库并从我的模型和控制器写入它。我收到了一行错误" DB.SaveChanges();"。错误指出:"更新条目时发生错误。有关详细信息,请参阅内部异常。"然后内部异常指出:"无效的对象名称' dbo.ContactModel'。"我查看了所有SO帖子中的类似问题,但似乎没有解决我的问题。我将发布我认为与该问题相关的代码。如果还有更多需要,请告诉我。

我的ContactContext.cs类:

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>();
        }
    }
}

我的&lt; connectionStrings&gt;在web.config中:

<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);
}

我认为这将是所有需要的。如果需要更多代码,请告诉我。

2 个答案:

答案 0 :(得分:2)

所以我终于通过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>());

这就是诀窍!

答案 1 :(得分:1)

如果您要覆盖OnModelCreating,则需要将映射传递给DbModelBuilder,因为实体名称和数据库中的表格不匹配:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    modelBuilder.Entity<ContactModel>().ToTable("Contacts");
}