簡體   English   中英

在實體框架中需要多個外鍵之一

[英]Require One of Multiple Foreign Keys in Entity Framework

我基本上是想在實體框架中強制執行這一點: 只要求多列之一不是 Null

我的數據庫有幾個 1:m 關系,其中子實體屬於幾個父實體之一。 例如,假設我有TeachersStudentsGuardians的表格。 每個都可以有很多PhoneNumbersEmailAddresses 我使用的是 EF Code First,我的模型看起來像:

public class Teacher {
    public int Id { get; set; }
    public string Name { get; set; }
    public List<PhoneNumber> PhoneNumbers { get; set; }
    public List<EmailAddress> EmailAddresses { get; set; }
}

public class Student {
    public int Id { get; set; }
    public string Name { get; set; }
    public List<PhoneNumber> PhoneNumbers { get; set; }
    public List<EmailAddress> EmailAddresses { get; set; }
}

public class Guardian {
    public int Id { get; set; }
    public string Name { get; set; }
    public List<PhoneNumber> PhoneNumbers { get; set; }
    public List<EmailAddress> EmailAddresses { get; set; }
}

public class PhoneNumber {
    public int Id { get; set; }
    public string Number { get; set; }
}

public class EmailAddress {
    public int Id { get; set; }
    public string Email { get; set; }
}

當我運行遷移時,這會創建包含我期望的表/列的數據庫。 PhoneNumbersEmailAddresses表各有列Teacher_IdStudent_IdGuardian_Id ,它們是各自父實體的外鍵。 但是,對子實體可以設置多少父實體沒有限制。 例如,我可以創建一個PhoneNumber ,將所有三個父 ID 都設置為 null,或者我可以同時設置Teacher_IdGuardian_Id

我嘗試像這樣向父母添加必需的屬性:

public class Teacher { // Also Student/Guardian
    public int Id { get; set; }
    public string Name { get; set; }

    [Required]
    public List<PhoneNumber> PhoneNumbers { get; set; }

    [Required]
    public List<EmailAddress> EmailAddresses { get; set; }
}

這似乎沒有任何效果。

我認為沒有辦法對實體執行此操作。 相反,創建一個遷移並嘗試更改遷移 class 中的表,如下所示:

    public partial class YourMigrationName: Migration
                            {
                              protected override void Up(MigrationBuilder migrationBuilder)
                                {
                                    migrationBuilder.Sql("ALTER TABLE [dbo].[PhoneNumber]  
    WITH CHECK ADD CONSTRAINT [CK_PhoneNumer_Teacher_Student_Guardian] CHECK  (Teacher_Id
 is not null or Student_Id is not null or Guardian_Id is not null)
                            GO
                            ALTER TABLE [dbo].[EmailAddress]  WITH CHECK ADD  CONSTRAINT 
            [CK_EmailAddress_Teacher_Student_Guardian] CHECK  (Teacher_Id is not null or 
        Student_Id is not null or Guardian_Id is not null)
                        ");
                                }
                            }

嘗試這個:

public class PhoneNumber 
{
    public int Id { get; set; }
    public string Number { get; set; }
    //Added this code:
    [Required] 
    public Teacher Teacher { get; set;}
}

public class EmailAddress {
    public int Id { get; set; }
    public string Email { get; set; }
    //Added this code:  
    [Required]
    public Teacher Teacher { get; set;}
}

這將確保您無法在沒有教師的情況下創建電話號碼。 你也可以這樣做:

public class PhoneNumber 
{
    public int Id { get; set; }
    public string Number { get; set; }
    public int TeacherId
    public Teacher Teacher { get; set;}
}

這也將檢測到您想在您的電話號碼上添加約束。 兩種方式都可以正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM