【问题标题】:How to map column names with EF 4.3.1?如何使用 EF 4.3.1 映射列名?
【发布时间】:2012-05-12 15:12:03
【问题描述】:

我遇到了简单映射的问题(使用 EF 4.3.1 - 代码优先方法)

public class Someclass
    {
        public virtual int ID { get; set; }
        public virtual string Name { get; set; }
    } 

someclass 带有 int ID 和 varchar someclass_name。 现在我想做的是用 someclass_name

映射 Name
 modelBuilder.Entity<Someclass>()
             .Property(r => r.Name).HasColumnName("someclass_name");

但是 id 不起作用并且异常说:“自创建数据库以来上下文已更改。考虑使用 Code First 迁移来更新数据库 (http://go.microsoft.com/fwlink/?LinkId=238269) 。”

我也试过这样做:

modelBuilder.Configurations.Add(new SomeclassMap());

public class SomeclassMap : EntityTypeConfiguration<Someclass>
    {
        public SomeclassMap() {
          //  this.Property(r => r.Name).HasColumnName("someclass_name");
            Map(r =>
            {
                Property(m => m.Name).HasColumnName("restaurant_name");
            });
        }
    }

谁能告诉我我做错了什么?谢了

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:

    您将需要使用 EF 4.3 的迁移实用程序。该错误通知您模型在数据库构建后已更改并且需要更新。看看这个链接:http://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-code-based-migrations-walkthrough.aspx

    【讨论】:

    • 谢谢。我以前看过这个链接。我会尝试遵循该解决方案,但这是解决该问题的唯一方法吗?是否可以以某种方式使用 OnModelCreating 和 modelBuilder ...?
    • -顺便说一句,当我阅读迁移教程时,没有关于在对象和数据库之间映射不同名称的问题。主要是关于添加新属性或删除
    【解决方案2】:

    不确定它是否会避免迁移通知,但您可以尝试将 [Column("someclass_name")] 添加到您的 Name 属性。

    查看名为Map a Property to a Column with a Different Name的部分

    【讨论】:

    • 它没有。我可以使用它,但它不是用于 Entity Framework 5.0 Beta 吗?
    • 问题是他们为什么会犯这样的错误?我可以编写代码并且它是正确的,但它不能正常工作。
    • 我不熟悉 Code First,但它只是将您的属性更改视为实际的数据库更改。它并没有“看到”它只是重命名属性,而是 not 实际上重命名了数据库列。我对“修复”它的工作原理不够熟悉,因此它不会将其视为实际的数据库更改,而只是属性名称的更改。 :(
    • 嗨,我得到了解决方案。我们需要通过该 Database.SetInitializer(null); 关闭上下文更改检查;而且我们可以映射列名。
    【解决方案3】:

    我安装了 EF 5 并遇到了同样的问题。 我“发现”的是

    [列(“名称”)]
    公共字符串 Name1 { 获取;放; }

    表示 Name1 指向 DB 中的字段“Name”。所以我没有更改字段名称,我在我的类中更改了属性名称,我让 EF 知道这个“Name1”指向“Name”。 这是一种有点奇怪的方法,但它是这样工作的。 DB 可能会在某处写下 DB 哈希并检查它是否更改。但我还不知道在哪里可以找到它。

    【讨论】:

      【解决方案4】:

      我找到了解决办法:

      Database.SetInitializer<SomeDB>(null);
      

      我们需要关闭数据库上下文检查

      【讨论】:

        猜你喜欢
        • 2012-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-01
        • 2018-09-29
        • 1970-01-01
        • 1970-01-01
        • 2014-08-24
        相关资源
        最近更新 更多