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
.
将我的数据层从 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
.