簡體   English   中英

實體框架-db.SaveChanges()錯誤

[英]Entity Framework - Error on db.SaveChanges()

我正在使用實體框架創建數據庫,並從我的模型和控制器對其進行寫入。 我在“ 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>();
        }
    }
}

而我的<connectionStrings>在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);
}

我認為這就是所需要的。 讓我知道是否需要更多代碼。

因此,我終於找到了一些幫助,將其從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()

因此,它試圖在不存在的表上運行選擇。 我發現必須將此行添加到構造函數的ContactContext類中:

Database.SetInitializer<ContactContext>(new CreateDatabaseIfNotExists<ContactContext>());

做到了!

如果要覆蓋OnModelCreating ,則需要將映射傳遞給DbModelBuilder ,因為實體名稱和數據庫中的表不匹配:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM