C# 如何从Fluent API为外键设置onUpdate?
我试图在EntityFramework7中获得一个外键关系,以便在删除级联上应用C# 如何从Fluent API为外键设置onUpdate?,c#,sql-server,entity-framework-core,C#,Sql Server,Entity Framework Core,我试图在EntityFramework7中获得一个外键关系,以便在删除级联上应用,在更新级联上应用sql约束 在OnModelCreating中使用模型生成器时,我能够指定删除时使用级联的关系。我需要帮助的是找出在哪里指定更新操作 以下是我的示例模型代码: class DatabaseContext : DbContext { protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
,在更新级联
上应用sql约束
在OnModelCreating
中使用模型生成器时,我能够指定删除时使用级联的关系。我需要帮助的是找出在哪里指定更新操作
以下是我的示例模型代码:
class DatabaseContext : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer("...connection string...");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Comment>()
.HasOne(c => c.Post)
.WithMany(p => p.Comments)
.HasForeignKey(c => c.PostName)
.OnDelete(DeleteBehavior.Cascade);
//if you delete the post, delete its comments
modelBuilder.Entity<Comment>().HasKey(c => new { c.Number, c.PostName });
}
}
class Post
{
[Required, Key, StringLength(100)]
public string Name { get; set; }
public string Contents { get; set; }
public List<Comment> Comments { get; set; }
}
class Comment
{
public int Number { get; set; }
[Required]
public Post Post { get; set; }
[Required, StringLength(100)]
public string PostName { get; set; }
public string Contents { get; set; }
}
请注意,最后一个参数已注释掉;我后来手动添加了这个。如果我取消对该行的注释,则创建的sql表不会应用更新级联上的
现在我需要手动更改迁移文件以添加更新级联支持。在Fluent API中是否有一种方法可以让迁移引擎在创建迁移文件时为我添加更新:referentialction.Cascade
给出了一些有趣的结果,这也是我如何发现手动编辑迁移文件是可行的
在CSharpMigrationOperationGenerator
类中,处理AddForeignKeyOperation
以写入onUpdate:
的方法,因此生成器必须能够写入所需的值。我如何触发它
为了尝试给出一个答案,我在
OnModelCreating
中创建外键后添加了以下内容:
modelBuilder.Entity<Comment>()
.Property(p => p.PostName)
.ValueGeneratedOnAddOrUpdate();
modelBuilder.Entity()
.Property(p=>p.PostName)
.ValueGeneratedOnAddOrUpdate();
创建的迁移与不使用此代码创建的迁移相同,因此结果sql表中没有任何更改。这也让我陷入了一段时间。您需要访问属性本身才能执行此操作
modelBuilder.Entity<Comment>()
.Property(c => c.YourProperty)
.ValueGeneratedOnAddOrUpdate();
modelBuilder.Entity()
.Property(c=>c.yourperty)
.ValueGeneratedOnAddOrUpdate();
这是令人困惑的,但如果你在VisualStudio中阅读了对它的描述,它将对它的功能有所帮助 这并没有在迁移过程中产生任何差异。我在帖子中添加了详细信息。
modelBuilder.Entity<Comment>()
.Property(c => c.YourProperty)
.ValueGeneratedOnAddOrUpdate();