如何解决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 举报,一经查实,本站将立刻删除。