明确声明导航属性

时间:2015-07-27 11:31:48

标签: c# .net oracle entity-framework

我试图将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,我不明白。

有没有办法在Entity Framework Code First中明确定义哪个列名必须用于引用属性?

1 个答案:

答案 0 :(得分:1)

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

public int ParentInterfaceId { get; set; }

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

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