繁体   English   中英

.net ef core-如何设置与compsite键的关系,我的表设计完全有意义吗?

[英].net ef core - How to set a relation to a compsite key and does my table design make sense at all?

我不确定如何设置带有唯一键的表与带有复合键的表之间的关系。 我想使用.net Entity Framework Core做到这一点,但我想它首先是一个sqlserver db设计问题。

我有一个表格,其中包含带有复合键(ID,CultureCode)的不同语言的文本
表:短文本
栏:ID(PK)
栏:CultureCode(PK)
栏:文字

我有多个表,这些表应该引用短文本表。 例如,这可能是
表格:网页
栏:ID(PK)
列:NameShorttextID
列:DescriptionShorttextID
其他不相关的列。

或例如许多其他表格
随机其他表
栏:ID(PK)
列:ContentShorttextID
其他不相关的列。

最后,我想像这样查询,但在.net核心中形成表格

SELECT w.ID, st1.Text as Name, st2.Text as Description
FROM Webpage w
JOIN Shorttext st1 on st1.ID = w.NameShorttextID and st1.CultureCode = 'en'
JOIN Shorttext st2 on st2.ID = w.DescriptionShorttextID and st2.CultureCode = 'en'

到目前为止,这有效。 但是,这是我最大的问题 :从数据库设计来看,这些表之间应该没有关系吗???

我猜想NameShorttextID (表网页)和DescriptionShorttextID (表网页)在某种程度上需要与表Shorttext的ID有关系。 ContentShorttextID (表RandomOtherTable)也是如此。 但这是行不通的,因为我无法设置从复合主键(ID,CultureCode)到NameShorttextID之类的单列(ForeignKey)的引用,还是可以吗? 还是表格之间的引用没有意义?

所以我想我会反过来做,例如,将NameShorttextID列设置为Unique Key并设置与ID(表Shorttext)的关系。 这适用于下面的代码,但是我想这没有任何意义,因为由于所有ist关系,我无法再向表Shorttext添加值。

我尝试了这个:


public class Webpage
{
    public int ID { get; set; }

    [Required]
    public int NameShorttextID { get; set; }

    [Required]
    public int DescriptionShorttextID { get; set; }
}

public class RandomOtherTable
{
    public int ID { get; set; }

    [Required]
    public int ContentShorttextID { get; set; }
}

// composite key
modelBuilder.Entity<Shorttext>()
            .HasKey(s => new { s.ID, s.CultureCode });

modelBuilder.Entity<Webpage>()
            .HasOne<Shorttext>()
            .WithOne()
            .HasForeignKey<Shorttext>(s => s.ID)
            .HasPrincipalKey<Webpage>(w => w.NameShorttextID)
            .OnDelete(DeleteBehavior.Restrict);

modelBuilder.Entity<Webpage>()
            .HasOne<Shorttext>()
            .WithOne()
            .HasForeignKey<Shorttext>(s => s.ID)
            .HasPrincipalKey<Webpage>(w => w.DescriptionShorttextID)
            .OnDelete(DeleteBehavior.Restrict);

modelBuilder.Entity<RandomOtherTable>()
            .HasOne<Shorttext>()
            .WithOne()
            .HasForeignKey<Shorttext>(s => s.ID)
            .HasPrincipalKey<RandomOtherTable>(w2 => w2.ContentShorttextID)
            .OnDelete(DeleteBehavior.Restrict);

// Prevents the creation of a unique ForeignKey ID, must only be unique with ID, CultureCode (composite key)
modelBuilder.Entity<Shorttext>()
            .HasIndex(w => w.ID)
            .IsUnique(false);

好吧,从技术上讲,上面的代码可以工作,但是我想它最后没有任何意义。

这里再次总结我的问题:-表短文本是否需要与数据库设计视图中的所有其他表有关系?
-如果该关系确实有效,那么您将如何使用ef core创建它们?
-如果您不设置表之间的关系,如何在.net core(ef / linq)中轻松地查询/更新/添加没有导航属性的数据?

如果有人能对此有所启发,我将不胜感激,因为正确地知道我很困惑……谢谢!!!

您需要两个表。 一个带有ShortTextID的PK,另一个带有不同翻译的子表。

create table ShortText(Id int primary key)

create table ShortTextTranslations
(
  ShortTextID int not null references ShortText,
  CultureCode varchar(10) not null references Cultures,
  Text nvarchar(max),
  constraint pk_ShortTextTranslations primary key (ShortTextID, CultureCode)
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM