gpt4 book ai didi

entity-framework - code first 一对一启用级联删除

转载 作者:行者123 更新时间:2023-12-04 13:19:46 24 4
gpt4 key购买 nike

我与外键有一对一的关系,但 Cascade Delete由于某种原因未启用。示例代码如下。

public class AppRegistration
{
public int AppRegistrationId { get; set; }
[Required]
[StringLength(50)]
[Display(Name = "Username")]
public string UserName { get; set; }
[Required]
[StringLength(100)]
public string Password { get; set; }
[StringLength(20)]
public string StudentOrAgent { get; set; }
// navigation properties
public virtual AppStatus AppStatus { get; set; }
public virtual Agreement Agreement { get; set; }
public virtual AnotherTable AnotherTable { get; set; }
}

带有外键的依赖表如下。
public class Agreement
{
[Key]
[ForeignKey("AppRegistration")]
public int AppRegistrationId { get; set; }
public DateTime DateAgreed { get; set; }
public virtual AppRegistration AppRegistration { get; set; }
}

当我尝试从生成的 AppRegistrations 中删除条目时表我得到一个引用约束冲突。

我试过把 [Required]在依赖表中的导航属性上,但它没有做任何事情 - Update-Database命令显示 No pending code-based migrations.信息。有任何想法吗?谢谢。

更新:
我收到以下错误消息:
The DELETE statement conflicted with the REFERENCE constraint "FK_dbo.AppStatus_dbo.AppRegistrations_AppRegistrationId". The conflict occurred in database "MVCapp", table "dbo.AppStatus", column 'AppRegistrationId'.

最佳答案

我决定解决 cascade delete单独的示例项目中的问题。我发现以下博客和 MSDN 页面非常有用。

  • http://blog.bennymichielsen.be/2011/06/02/entity-framework-4-1-one-to-one-mapping/
  • http://msdn.microsoft.com/en-us/library/gg671256%28v=VS.103%29.aspx
  • http://msdn.microsoft.com/en-us/library/gg671273%28v=VS.103%29.aspx

  • 使用 Code First方法创建以下模型。
    public class Category
    {
    public int CategoryId { get; set; }
    public string CategoryName { get; set; }
    public virtual Book Book { get; set; }
    }
    public class Book
    {
    public int CategoryId { get; set; }
    public string BookTitle { get; set; }
    public string BookAuthor { get; set; }
    public string BookISBN { get; set; }
    public virtual Category Category { get; set; }
    }

    (我意识到实体名称暗示了一对多关系,但我正在尝试对 1 对 1 关系建模,就像我在顶部的原始问题一样。)

    因此,在上述模型中每个 分类 只能有一个 预订 .

    在您的 DbContext - 派生类添加以下内容。
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

    modelBuilder.Entity<Book>()
    .HasKey(t => t.CategoryId);

    modelBuilder.Entity<Category>()
    .HasRequired(t => t.Book)
    .WithRequiredPrincipal(t => t.Category)
    .WillCascadeOnDelete(true);
    }

    (以上代码需要以下命名空间: System.Data.EntitySystem.Data.Entity.ModelConfiguration.Conventions 。)

    这正确地创建了 1 对 1 关系。每个表中都有一个主键, Book 中还有一个外键。表带 ON DELETE CASCADE启用。

    Database Diagram for the model

    在上面的代码中,在 Category我使用的实体 WithRequiredPrincipal() t => t.Category参数,其中参数是从属表中的外键列。

    如果您使用 WithRequiredPrincipal() 没有 一个参数,你会在 Book 中得到一个额外的列表,您将在 Book 中有两个外键指向 CategoryId 的表在 Category table 。

    我希望这些信息有帮助。

    更新

    后来我直接在这里找到了答案:

    http://msdn.microsoft.com/en-us/data/jj591620#RequiredToRequired

    关于entity-framework - code first 一对一启用级联删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16485831/

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