entity framework 的关系问题?怎么做到非主外键关联
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了entity framework 的关系问题?怎么做到非主外键关联相关的知识,希望对你有一定的参考价值。
参考技术A 什么叫"非主外键"关联?如果你不喜欢用外键的话, 在EF中可以不用他, 自己在代码中去维护上下级的关系即可
在 Entity Framework 6 中设置表关系
【中文标题】在 Entity Framework 6 中设置表关系【英文标题】:Setting Table Relationships in Entity Framework 6 【发布时间】:2022-01-19 16:21:12 【问题描述】:我需要 EF6 中的结构,其中项目颜色可以有多个翻译。这种结构是否支持该功能,是否正确?
我正在尝试应用以下关系:
每个 PIMItem 有 1 个 PIMColor 每个 PIMColor 可以有多个 PIMColorTranslations 每个语言代码的每种颜色只允许 1 个 PIMColorTranslation。 [Table("PIMItem")]
public class PIMItem
[Key]
public string Id get;set;//RowKey no.
//there are additional columns in this item not related to color
[ForeignKey("PIMColor")]
[Column(Order=3)]
public string ColorId get;set;
public PIMColor PIMColor get;set;
[Table("PIMColor")]
public class PIMColor
[Key]
public string ColorId get;set;
public ICollection<PIMItem> PIMItems get;set;
public ICollection<PIMColorTranslation> PIMColorTranslation get;set;
[Table("PIMColorTranslation")]
public class PIMColorTranslation
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column(Order=1)]
public int Id get;set;
[ForeignKey("PIMLanguage")]
[Column(Order=2)]
public string LanguageCode get;set;
[ForeignKey("PIMColor")]
[Column(Order=3)]
public string ColorId get;set;
public string Translation get;set;
[Table("PIMLanguage")]
public class PIMLanguage
[Key]
public string LanguageCode get;set;
public string Language get;set;
public ICollection<PIMColorTranslation> PIMColorTranslation get;set;
public class SharedCtxt : DbContext
public SharedCtxt() : base(sharedData.conn_string)
public DbSet<PIMLanguage> PIMLanguages get;set;
public DbSet<PIMColor> PIMColors get;set;
public DbSet<PIMColorTranslation> PIMColorTranslations get;set;
public DbSet<PIMItem> PIMItems get;set;
protected override void OnModelCreating(DbModelBuilder modelBuilder)
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
【问题讨论】:
【参考方案1】:对于LanguageCode
和ColorId
,您需要在PIMColorTranslation
中使用unique
约束。
我不知道是否有一个属性,但你可以使用Fluent API
:
protected override void OnModelCreating(ModelBuilder modelBuilder)
...
modelBuilder.Entity<PIMColorTranslation>(entity =>
...
entity.HasIndex(e => new e.LanguageCode, e.ColorId ).IsUnique();
...
);
...
另一个说明:
将virtual
添加到导航属性。见why-use-virtual-for-class-properties-in-entity-framework-model-definitions
只是一个建议:
使用Fluent API
配置架构。注释不能做太多事情,而且它确实会使代码膨胀。
【讨论】:
感谢您的反馈!以上是关于entity framework 的关系问题?怎么做到非主外键关联的主要内容,如果未能解决你的问题,请参考以下文章
使用.Net Entity Framework 问题删除具有子关系的实体
如何解决可能的一对一关系问题 - Entity Framework Core
Entity Framework Core 2.1 无法更新具有关系的实体
Entity Framework 和 .NET 的一对一关系