EF6(代码优先)单个外键属性

时间:2017-07-04 12:52:39

标签: entity-framework navigation-properties

将我的数据层从Telerik迁移到EF6时,我有POCO 命名问题EF模型是"代码优先"从现有数据库生成。因为我不想更改业务层,所以需要在数据层中完成所有迁移/配置。我还尝试保持数据库中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 */
}

这是开箱即用的,因为命名约定是正确的(生成) 但现在我想基于相同的数据库FK ID(在业务层中使用)添加导航属性,

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(&#34; MyForeignKeyApplicationPoco&#34;)]来装饰Id属性,但后来它抱怨&#34; MyForeignKeyDatabasePoco&#34;没有(外国)密钥。我不能将两个foreignkey装饰器设置为id属性。

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

A)这可能吗? B)当定义实体MyPoco(或者fk poco&amp; s中的任何一个或两个)时,我是否应该在OnModelCreating(DbModelBuilder modelBuilder)中更改某些内容? C)我是否应该删除生成的nav属性以支持传统业务属性(不是首选的选项btw)

非常感谢任何帮助。

在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&lt; MyForeignKeyApplicationPoco&gt;添加并在流畅的OnModelCreating(DbModelBuilder模型构建器) modelBuilder.Entity&lt;添加了MyForeignKeyApplicationPoco&gt;();

1 个答案:

答案 0 :(得分:1)

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

否则你可以使用流畅的配置(通常我用这种方式)。

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

在这种情况下,一对多关系(一个PianoDiRientro多个Rates),外键列名称为IdPianoDiRientro