EF6(代码优先)单个外键上的多个导航属性 属性

EF6 (code first) Multiple nav properties on single foreign key property

将我的数据层从 Telerik 迁移到 EF6 时,我遇到了 POCO 命名问题EF 模型是 "code first" 从现有数据库生成的。因为我不想改变业务层,所有migration/configuration都需要在数据层完成。我还尝试保持数据库中的 EF 代码生成不变,以便将来维护,同时使用部分 类 来保持遗留代码的完整性。

因此 EF 生成带有 FK 引用的 poco,如下所示:

public partial class MyPoco
{
        public Guid? MyForeignKeyDatabasePocoId { get; set; } /* Foreign key database column */

        public virtual MyForeignKeyDatabasePoco { get; set; } /* Navigation property MyForeignKeyDatabasePocoId database column */
}

这是开箱即用的,因为命名约定是正确的(生成的) 但是现在我喜欢根据同数据库FKId(业务层使用),属性添加一个导航,

public partial class MyPoco
{

        [ForeignKey("MyForeignKeyApplicationPoco", "MyForeignKeyDatabasePocoId")]  /* <- not possible, no constructor accepts two parms */
        public Guid? MyForeignKeyDatabasePocoId { get; set; }   /* Foreign key database column */

        public virtual MyForeignKeyDatabasePoco {get; set; }    /* Navigation property FK MyForeignKeyDatabasePocoId database column */

        public virtual MyForeignKeyApplicationPoco {get; set; } /* Navigation property FK MyForeignKeyDatabasePocoId database column */
}

我尝试用 [ForeignKey("MyForeignKeyApplicationPoco")] 装饰 Id 属性 但随后它抱怨 "MyForeignKeyDatabasePoco" 没有(外)键。我也无法将两个外键装饰器设置为 id 属性。

MyForeignKeyDatabasePoco和MyForeignKeyApplicationPoco是相似的,它们都存在于模型中。

A) 这可能吗? B) 当实体 MyPoco 被定义时(或 fk poco 中的一个或两个),我是否应该在 OnModelCreating(DbModelBuilder modelBuilder) 中更改某些内容? C) 我是否应该摆脱生成的导航 属性 以支持旧业务 属性(顺便说一句,这不是首选)

如有任何帮助,我们将不胜感激。

bubi评论后编辑

用继承解决了。首先抽象出数据库poco然后应用poco继承数据库poco

public abstract partial class MyForeignKeyDatabasePoco 
{
    /* EF generated code */ 
}

public partial class MyForeignKeyApplicationPoco : MyForeignKeyDatabasePoco 
{
    /* additional things todo */ 
}

public partial class MyPoco
{
        public Guid? MyForeignKeyDatabasePocoId { get; set; } /* Foreign key database column */

        public virtual MyForeignKeyApplicationPoco { get; set; } /* Navigation property to MyForeignKeyDatabasePocoId database column */
}

在流畅的模型中添加了 DbSet< MyForeignKeyApplicationPoco > 并在流畅的 OnModelCreating(DbModelBuilder modelBuilder) modelBuilder.Entity< MyForeignKeyApplicationPoco >(); 中添加。

实际上我认为如果不在外键字段名称中添加 属性 是不可能使用属性的。在这种情况下,您可以使用 ForeignKey 属性将 属性 设置为外键。

否则你可以使用fluent configuration(一般我都是这样)。

modelBuilder.Entity<OfficeAssignment>() 
        .HasRequired(t => t.PianoDiRientro)
        .WithMany(t => t.Rates)
        .Map(d => d.MapKey("IdPianoDiRientro"));

在这种情况下是一对多关系(一个 PianoDiRientro 多个 Rates)并且外键列名称是 IdPianoDiRientro.