将我的数据层从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;(); 。
答案 0 :(得分:1)
实际上,如果您不添加具有外键字段名称的属性,我认为不可能使用属性。在这种情况下,您可以使用ForeignKey属性将该属性设置为外键。
否则你可以使用流畅的配置(通常我用这种方式)。
modelBuilder.Entity<OfficeAssignment>()
.HasRequired(t => t.PianoDiRientro)
.WithMany(t => t.Rates)
.Map(d => d.MapKey("IdPianoDiRientro"));
在这种情况下,一对多关系(一个PianoDiRientro
多个Rates
),外键列名称为IdPianoDiRientro
。