微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

OnDelete 的 EF Core 注释

如何解决OnDelete 的 EF Core 注释

我有一个注释问题:

        modelBuilder.Entity<FirstClass>()
            .HasOne(f => f.SecondClass)
            .WithOne(s => s.FirstClass)
            .HasForeignKey<FirstClass>(f => f.SecondClassId)
            .OnDelete(DeleteBehavior.Cascade);

如何用注解写这个?我没有找到 OnDelete 的注释。

解决方法

试试这个:

您的模型


public class FirstClass
    {
        [Key]
        public int Id { get; set; } 
        public int SecondClassId { get; set; }

        [ForeignKey(nameof(SecondClassId))]
        [InverseProperty("FirstClasses")]
        public virtual SecondClass SecondClass { get; set; }
    }
    public class SecondClass
    {
        [Key]
        public int Id { get; set; }
        [InverseProperty(nameof(FirstClass.SecondClass))]
        public virtual ICollection<FirstClass> FirstClasses { get; set; }

    }

如果你只想第一次和第二次尝试这个代码。但我不推荐这样做,因为很难找到错误。

public class FirstClass
    {
        [Key]
        public int Id { get; set; } 
        public int SecondClassId { get; set; }

        [ForeignKey(nameof(SecondClassId))]
        [InverseProperty("FirstClass")]
        public virtual SecondClass SecondClass { get; set; }
    }
    public class SecondClass
    {
        [Key]
        public int Id { get; set; }
        [InverseProperty(nameof(FirstClass.SecondClass))]
        public virtual FirstClass FirstClass { get; set; }

    }

您的数据库上下文:


public class FirstClassDbContext : DbContext
    {
        public FirstClassDbContext()
        {
        }

        public FirstClassDbContext(DbContextOptions<FirstClassDbContext> options)
            : base(options)
        {
        }
        
        public DbSet<FirstClass> FirstClasses { get; set; }
        public DbSet<SecondClass> SecondClasses { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {

            optionsBuilder.UseSqlServer(@"Server=localhost;Database=FirstClass;Trusted_Connection=True;");
        }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<FirstClass>(entity =>
            {
                entity.HasOne(d => d.SecondClass)
                   .WithMany(p => p.FirstClasses)
                   .HasForeignKey(d => d.SecondClassId)
                   .OnDelete(DeleteBehavior.ClientSetNull)
                   .HasConstraintName("FK_FirstClass_SecondClass");
            });

          // or for one to one you can use yours,but I don't recommend it since
//it will be hard to find the errors and it will not do anything for you. 
//Only confusing queries.

             modelBuilder.Entity<FirstClass>()
            .HasOne(f => f.SecondClass)
            .WithOne(s => s.FirstClass)
            .HasForeignKey(d => d.SecondClassId)
            .OnDelete(DeleteBehavior.ClientSetNull)
            .HasConstraintName("FK_FirstClass_SecondClass");
        }
    }

,

我认为没有必要。

    public class GeneralClass
    {
        public int Id { get; set; }
    }

    public class FirstClass : GeneralClass
    {
        public int? DerivedClassId { get; set; }
        public string Name { get; set; }
        [InverseProperty(nameof(EFCoreTest.SecondClass.FirstClass))]
        public SecondClass SecondClass { get; set; }
        public DerivedClass DerivedClass {get; set; }
    }

    public class SecondClass : GeneralClass
    {
        public int FirstClassId { get; set; }
        public string Url { get; set; }
        [ForeignKey(nameof(FirstClassId))]
        public FirstClass FirstClass { get; set; }
    }
    
    public class ApplicationDbContext : DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer(@"Server=(localdb)\MSSQLLocalDB;Database=sample;Trusted_Connection=True");
        }

        public DbSet<FirstClass> FirstClasses { get; set; }
        public DbSet<SecondClass> SecondClasses {get; set; }
    }

这将生成表定义

CREATE TABLE [dbo].[SecondClasses] (
    [Id]           INT            IDENTITY (1,1) NOT NULL,[FirstClassId] INT            NOT NULL,[Url]          NVARCHAR (MAX) NULL,CONSTRAINT [PK_SecondClasses] PRIMARY KEY CLUSTERED ([Id] ASC),CONSTRAINT [FK_SecondClasses_FirstClasses_FirstClassId] FOREIGN KEY ([FirstClassId]) REFERENCES [dbo].[FirstClasses] ([Id]) ON DELETE CASCADE
);


GO
CREATE UNIQUE NONCLUSTERED INDEX [IX_SecondClasses_FirstClassId]
    ON [dbo].[SecondClasses]([FirstClassId] ASC)

;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?