第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

EF Core SQLite TPH interitance 組合鍵 -> 重復(fù)鍵?

EF Core SQLite TPH interitance 組合鍵 -> 重復(fù)鍵?

C#
不負(fù)相思意 2021-10-23 17:27:52
我正在嘗試使用一對(duì)多關(guān)系和 TPH 映射來設(shè)置一個(gè)簡(jiǎn)單的 SQLite 數(shù)據(jù)庫(kù)。已使用以下命令應(yīng)用表創(chuàng)建:CREATE TABLE Masters (Id VARCHAR2 PRIMARY KEY);CREATE TABLE Slaves (    MasterId VARCHAR2 NOT NULL,    Discriminator VARCHAR2 NOT NULL,    SlaveAValue VARCHAR2,    SlaveBValue VARCHAR2,    PRIMARY KEY (MasterId, Discriminator),    FOREIGN KEY (MasterId) REFERENCES Master(Id) ON DELETE CASCADE);模型類定義為:[Table("Masters")]public class Master{    [Column("Id")]    [Key, Required]    public string Id { get; set; }    public List<Slave> Slaves { get; set; } = new List<Slave>();}[Table("Slaves")]public abstract class Slave{    [Column("MasterId")]    [Required]    public string MasterId { get; set; }    [ForeignKey("MasterId")]    public Master Master { get; set; }}public class SlaveA : Slave{    [Column("SlaveAValue")]    [Required]    public string SlaveAValue { get; set; }}public class SlaveB : Slave{    [Column("SlaveBValue")]    [Required]    public string SlaveBValue { get; set; }}為了告訴 efslaves有一個(gè)組合鍵,我覆蓋OnModelCreating了內(nèi)容:modelbuilder.Entity<Slave>().HasKey("MasterId", "Discriminator");base.OnModelCreating(modelbuilder);但是,如果我嘗試向上下文添加值,則會(huì)出現(xiàn)異常:var master = new Master { Id = "Master 01" };var slaveA = new SlaveA { Master = master, SlaveAValue = "A 01" };var slaveB = new SlaveB { Master = master, SlaveBValue = "B 01" };master.Slaves.Add(slaveA);master.Slaves.Add(slaveB);await context.Masters.AddAsync(master); // Exceptionawait context.SaveChangesAsync();異常消息是: The instance of entity type 'SlaveB' cannot be tracked because another instance with the same key value for {'MasterId', 'Discriminator'} is already being tracked.???數(shù)據(jù)庫(kù)中的所有表都是完全空的(新創(chuàng)建的)。我的猜測(cè)是discriminator在將主值添加到上下文時(shí)尚未確定該值。添加一個(gè)包含該discriminiator值的字段并不能解決問題(我也猜到了,但試了一下......)。我是否真的必須向從表添加專用的 id 列才能使其與 ef-core 一起使用,還是有其他解決方案?基于SBFrancies提示的解決方案將一個(gè)字段添加到Slave名為的基類Discriminator:[Column("Discriminator")][Required]public abstract string Discriminator { get; set; }實(shí)施變革SlaveA和SlaveB:public override string Discriminator{    get => nameof(SlaveA);     set { }}
查看完整描述

1 回答

?
素胚勾勒不出你

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超9個(gè)贊

兩個(gè)從站具有相同的 MasterID(“Master 01”)和相同的鑒別器(空),因此它們具有相同的主鍵,這導(dǎo)致了問題。


更新


一種可能的解決方案是為每種類型添加一個(gè)鑒別器:


public class SlaveA : Slave

{

    public string Discriminator => "S1";


    [Column("SlaveAValue")]

    [Required]

    public string SlaveAValue { get; set; }

}


public class SlaveB : Slave

{

    public string Discriminator => "S2";


    [Column("SlaveBValue")]

    [Required]

    public string SlaveBValue { get; set; }

}

替代方案


對(duì)以上內(nèi)容表示歉意。我認(rèn)為更好的選擇是在 Slaves 表上有一個(gè)新的人工主鍵。


CREATE TABLE Slaves (

    SlavesId INT NOT NULL IDENTITY PRIMARY KEY,

    MasterId VARCHAR2 NOT NULL,

    Discriminator VARCHAR2 NOT NULL,

    SlaveAValue VARCHAR2,

    SlaveBValue VARCHAR2,

    FOREIGN KEY (MasterId) REFERENCES Master(Id) ON DELETE CASCADE

);


[Table("Slaves")]

public abstract class Slave

{


    [Column("SlaveId")]

    [Key]

    public int SlaveId {get;set;}


    [Column("MasterId")]

    [Required]

    public string MasterId { get; set; }


    [ForeignKey("MasterId")]

    public Master Master { get; set; }

}

然后在您的數(shù)據(jù)庫(kù)中添加一個(gè)唯一索引,以確保每個(gè) master 類型不會(huì)超過一種:


CREATE UNIQUE INDEX master_index ON Slaves(MasterId, Discriminator);


查看完整回答
反對(duì) 回復(fù) 2021-10-23
  • 1 回答
  • 0 關(guān)注
  • 172 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)