簡體   English   中英

從一個表到多個表一對一

[英]One to many from one table to multiple tables

我該如何配置從一個表(帳戶)到兩個表的一對多關系

public class Account
{
    public int AccountID { get; set; }
    [Required(ErrorMessage = "Please enter a username")]
    [Display(Name = "Username")]
    public string Username { get; set; }
    public string  userid { get; set; }
    [Required(ErrorMessage = "Please enter the password")]
    [Display(Name = "Password")]
    public string Password { get; set; }
    public ICollection<Post> Posts { get; set; }
    public ICollection<Comment> Comments { get; set; }
}


public class Post
{
    public int PostId { get; set; }
    [Required]
    public string Heading { get; set; }
    [Required]
    public string PostText { get; set; }
    public virtual Account Account {get;set;}
    public ICollection<Comment> Comments { get; set; }
}


public class Post
{
    public int PostId { get; set; }
    [Required]
    public string Heading { get; set; }
    [Required]
    public string PostText { get; set; }
    public virtual Account Account {get;set;}
    public ICollection<Comment> Comments { get; set; }
}

以下是我的流利的api

modelBuilder.Entity<BusinessObjects.Account>().HasMany(a => a.Posts).WithRequired().Map(m => m.MapKey("AccountId"));
modelBuilder.Entity<BusinessObjects.Account>().HasMany(a => a.Comments).WithRequired().Map(m => m.MapKey("AccountId"));
modelBuilder.Entity<BusinessObjects.Post>().HasMany(p => p.Comments).WithRequired().Map(m => m.MapKey("Postid"));

以下是我得到的錯誤:

在表“ Posts”上引入FOREIGN KEY約束“ FK_dbo.Posts_dbo.Accounts_AccountId”可能會導致循環或多個級聯路徑。 指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY約束。 無法創建約束

我想我流利的api帳戶->發布可能不正確,有人可以提出解決方案嗎?

配置方式,所有關聯都是必需的,這意味着:

  • 如果刪除帳戶,則級聯刪除相關的帖子。
  • 如果刪除帳戶,則級聯刪除所有相關的注釋。
  • 如果刪除帖子,則級聯刪除所有評論。

因此,如果刪除一個帳戶,則該帳戶具有多個路徑:

  • 它可以刪除所有相關帖子,然后刪除所有相關評論
  • 它可以刪除所有相關評論

這會導致不一致,因為刪除帳戶時SQL Sever不知道確切要做什么。

為了解決這個問題,您應該考慮使用WithOptional()替換一些WithRequired() WithOptional() ,如果這對您有意義,然后再試一次。

例如,考慮:

modelBuilder.Entity<BusinessObjects.Account>().HasMany(a => a.Posts).WithOptional().Map(m => m.MapKey("AccountId"));
modelBuilder.Entity<BusinessObjects.Account>().HasMany(a => a.Comments).WithOptional().Map(m => m.MapKey("AccountId"));
modelBuilder.Entity<BusinessObjects.Post>().HasMany(p => p.Comments).WithRequired().Map(m => m.MapKey("Postid"));

或者,您可以使用.WillCascadeOnDelete(false)禁用級聯刪除。

暫無
暫無

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

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