【问题标题】:Explicitly declare the column name for a navigation property显式声明导航属性的列名
【发布时间】:2015-07-27 11:31:48
【问题描述】:

我正在尝试将 Entity Framework 6.1.3 与 Oracle 12c 数据库服务器一起使用。我已被警告。但我还没有准备好告诉客户这是不可能的。我已经设置了一些技巧。现在我需要另一个。生成的列名很容易超过 30 个字符,但 Oracle 仍然无法处理这些。所以我以为我只是将ColumnAttribute 用于这些属性,但它只是被导航属性忽略了。

这里有一些示例代码:

public class Component
{
    public int ComponentId { get; set; }
    [Column("ParentIF")]
    public virtual Interface ParentInterface { get; set; }
}
public class Interface
{
    public int InterfaceId { get; set; }
}

生成的名称将是“ParentInterface_InterfaceId”。我想将其更改为更短的“ParentIF”。上面的代码不起作用,它仍然使用较长的名称。

我在其他地方找到的一些代码使用了这样的东西:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // Fix reference column names to support Oracle's 30 characters restriction.
    // Entity Framework ignores Column attribute on reference columns.
    modelBuilder.Entity<Component>()
        .Map(m => m.MapKey("ParentIF"));

    base.OnModelCreating(modelBuilder);
}

但这是不完整的。它缺少应该像这样映射哪一列的规范。我找不到丢失的部分。而且它不会编译。

另一个想法是使用类似以下的东西:

modelBuilder.Entity<Component>()
    .Property(c => c.ParentInterface)
    .HasColumnName("ParentIF");

这给了我一个我不理解的编译器错误 CS0453。

有没有办法明确定义实体框架代码优先中的引用属性必须使用什么列名?

【问题讨论】:

    标签: c# .net oracle entity-framework


    【解决方案1】:

    最简单的方法可能是在模型中为接口 ID 添加另一个属性:

    public int ParentInterfaceId { get; set; }
    

    现在您可以使用Column 属性控制列名:

    [Column("ParentIF")]
    public int ParentInterfaceId { get; set; }
    

    【讨论】:

    • 这不是参考属性。我真的很想保留这些以利用 EF。如果我需要自己获取所有相关记录,我不妨使用更简单的 O/R 映射器,它可以与 Oracle 无缝协作。 (我碰巧自己也写过。)
    • 对不起,我真的不明白你在说什么。此解决方案仅使列的名称显式,仅此而已。它不会以任何方式改变您的模型。
    • 附加属性必须使用什么名称? EF 如何检测这两个属性相关?
    • 您可以让 EF 自己建立关联(它将采用虚拟 PropertyX 并将其链接到 PropertyXId)或使用 ForeignKey 属性手动指定它。
    • 那行得通。现在我还剩下集合属性,这些属性在对面(引用)表中获取长列名。
    猜你喜欢
    • 1970-01-01
    • 2011-08-07
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多