gpt4 book ai didi

entity-framework - Entity Framework - 与假外键的关系(数据库中没有外键)

转载 作者:行者123 更新时间:2023-12-04 07:27:11 24 4
gpt4 key购买 nike

我有很多表都有指向翻译表的 TextID 列。翻译表还需要 LanguageID 以获取所需语言的翻译文本。我的问题是我的数据库中没有 LanguageID,它是在系统中预定义的,我不知道如何使用 Fluent API 定义它,即这可以是我的模型:

public partial class MyEntity
{
public short ID { get; set; }
public Nullable<int> TextID { get; set; }
[NotMapped]
public Nullable<int> LanguageID { get; set; }
public virtual TEXT_TRANSLATION Translation { get; set; }
}

和翻译表:
public partial class TEXT_TRANSLATION
{
[Key, Column(Order = 0)]
public int TextID { get; set; }

[Key, Column(Order = 1)]
public int LanguageID { get; set; }

public string TranslatedText { get; set; }
}

基本上我需要这样的导航:
myEntity.Translation.TranslatedText

在使用 SQL 时,我会这样做:
Left Join TEXT_TRANSLATION ON 
MyEntity.TextID = TEXT_TRANSLATION.TextID
AND TEXT_TRANSLATION.LanguageID = 1033

基本上我想使用 TextID 外键并获得 只有一个 翻译 - LanguageID 是静态的并在上下文中预定义。

我无法更改现有的数据库架构。如果我不需要在我的代码中映射 LanguageID 字段,那将是完美的,只需在映射中像系统参数一样使用它。 EF 甚至有可能吗?

最佳答案

如果您的 LanguageID是静态的,您可以尝试使用此 hack。

定义您的实体,例如:

public class Entity {
public int Id { get; set; }
public int TextId { get; set; }
public Translation Translation { get; set; }
}

// No LanguageId in translation
public class Translation {
public int TextId { get; set; }
public string TranslatedText { get; set; }
}

并将这个流畅的映射添加到 OnModelCreating在您派生的 DbContext :
// Define foreign key
modelBuilder.Entity<Entity>()
.HasRequired(e => e.Translation)
.WithMany()
.HasForeignKey(e => e.TextId);

// Trick - EF believes that only TextId is PK. Without this trick you cannot
// make navigation property on your entity
modelBuilder.Entity<Translation>()
.HasKey(t => t.TextId);

// If you are going to insert translations as well your TextId cannot be
// handled as autogenerated column
modelBuilder.Entity<Translation>()
.Property(t => t.TextId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

// The HACK - conditional mapping. This tells EF to "see" only records
// with LanguageId set to 1033. Without this hack you cannot filter
// translations for only single language.
modelBuilder.Entity<Translation>()
.Map(m => {
m.Requires("LanguageId").HasValue(1033);
m.ToTable("Translations");
});

hack 基于用于 TPH 映射的概念,但在这种情况下,您仅使用单个实体类型来加载预定义的记录子集 LanguageId .即使来自主要实体的 FK 也应该工作,因为您不必使用相同的 TextId 进行翻译。 - 这意味着他们也有相同的 LanguageId这是不可能的,因为 TextIdLanguageId形成主键。

我不确定这个解决方案中是否有任何隐藏的问题。我只是快速尝试了一下,它奏效了。

关于entity-framework - Entity Framework - 与假外键的关系(数据库中没有外键),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14565845/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com