我试图将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中明确定义哪个列名必须用于引用属性?
答案 0 :(得分:1)
最简单的方法可能是为模型添加另一个属性作为接口Id:
public int ParentInterfaceId { get; set; }
现在,您可以使用Column
属性控制列名称:
[Column("ParentIF")]
public int ParentInterfaceId { get; set; }