【问题标题】:cant insert complex object to database using entity frame work无法使用实体框架将复杂对象插入数据库
【发布时间】:2012-03-31 16:55:28
【问题描述】:

我正在开发一个 asp.net mvc 应用程序,它具有以下实体类:

public class Person
    {
        public int PersonID { get; set; }
        public string PersonPicAddress { get; set; }

        public virtual List<Person_Local> PersonLocal { get; set; }
}

public class Person_Local
{
    public int PersonID { get; set; }

    public int CultureID { get; set; }

    public string PersonName { get; set; }

    public string PersonFamily { get; set; }

    public string PersonAbout { get; set; }

    public virtual Culture Culture { get; set; }

    public virtual Person Person { get; set; }
}

public class Culture
{
    public int CultureID { get; set; }

    [Required()]
    public string CultureName { get; set; }

    [Required()]    
    public string CultureDisplay { get; set; }

    public virtual List<HomePage> HomePage { get; set; }

    public virtual List<Person_Local> PersonLocak { get; set; }
}

我用 [Httppost] 属性定义了一个动作,它接受来自视图的复杂对象。

这里是动作:

[HttpPost]
public ActionResult CreatePerson([Bind(Prefix = "Person")]Person obj)
        {

      AppDbContext da = new AppDbContext();

      //Only getting first PersonLocal from list of PersonLocals
      obj.PersonLocal[0].Person = obj;

       da.Persons.Add(obj);

       da.SaveChanges();

       return Jsono(...);

}

但是当它抛出如下错误时:

Exception:Thrown: "Invalid column name 'Culture_CultureID'." (System.Data.SqlClient.SqlException)
A System.Data.SqlClient.SqlException was thrown: "Invalid column name 'Culture_CultureID'."

还有插入语句:

ADO.NET:Execute Reader "insert [dbo].[Person_Local]([PersonID], [PersonName], [PersonFamily], [PersonAbout], [Culture_CultureID])
values (@0, @1, @2, @3, null)
select [CultureID]
from [dbo].[Person_Local]
where @@ROWCOUNT > 0 and [CultureID] = scope_identity()"
The command text "insert [dbo].[Person_Local]([PersonID], [PersonName], [PersonFamily], [PersonAbout], [Culture_CultureID])
values (@0, @1, @2, @3, null)
select [CultureID]
from [dbo].[Person_Local]
where @@ROWCOUNT > 0 and [CultureID] = scope_identity()" was executed on connection "Data Source=bab-pc;Initial Catalog=MainDB;Integrated Security=True;Application Name=EntityFrameworkMUE", building a SqlDataReader.

问题出在哪里?

已编辑:

包含的 EntityConfigurations 代码:

   public class CultureConfig : EntityTypeConfiguration<Culture>
    {
        public CultureConfig()
        {

            HasKey(x => x.CultureID);

            Property(x => x.CultureName);

            Property(x => x.CultureDisplay);

            ToTable("Culture");
        }
    }

    public class PersonConfig : EntityTypeConfiguration<Person>
    {
        public PersonConfig()
        {

            HasKey(x => x.PersonID);

            Property(x=>x.PersonPicAddress);

            ToTable("Person");
        }
    }

    public class Person_LocalConfig : EntityTypeConfiguration<Person_Local>
    {
        public Person_LocalConfig()
        {
            HasKey(x => x.PersonID);

            HasKey(x => x.CultureID);

            Property(x=>x.PersonName);

            Property(x => x.PersonFamily);

            Property(x => x.PersonAbout);

            ToTable("Person_Local");

          }

    }

【问题讨论】:

    标签: asp.net-mvc-3 entity-framework-4


    【解决方案1】:

    尝试从 Person_Local 类中删除字段 CultureID 和 PersonID。因为你已经有了字段 Person 和 Culture

    【讨论】:

    • 删除它们会破坏我的视图模板。
    • 无论如何,在一个类中定义外键和指向对象的链接是错误的。您只需添加带有对象链接的字段。如果您在视图中使用外键,您也可以使用它们。只需使用Model.Person.PersonIDModel.Culture.CultureID
    • 即使删除了这些 int 属性,仍然会出现相同的错误。您提到要删除的那些键是 Person_Local 的主键。
    【解决方案2】:

    您的架构似乎与您的模型不同步。确保您了解this blog 中描述的 EF 代码优先架构更新功能。如果您需要更复杂的架构迁移,this question 的答案中有一些其他方法。

    【讨论】:

    • 数据库中的模式与我在实体的每个 EntityConfiguration 中定义的模式之间没有任何不匹配。
    猜你喜欢
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    相关资源
    最近更新 更多