如何在不知道 table 名称的情况下使用 NHibernate 删除 JOIN table(多对多)中的记录
How to delete records in JOIN table (many-to-many) using NHibernate without knowing table name
我正在尝试删除 NHibernate 中映射 table 的所有记录,作为通过浏览器进行功能测试设置的一部分。从其他问题中,我得到了所有映射的 classes 的 class 元数据,这让我得到了 table 名称。从那里我正在对数据库执行 SQL 删除语句。这工作得很好,除了我有一个连接 table 不是直接映射的,而是作为多对多关系的一部分映射的。
正是这个table,多对多的关系,我需要弄清楚,但我不知道该怎么做。虽然我不能 post 确切的映射,但这里是数据库模式的近似值:
BlogPosts
---------
BlogPostId (Primary Key)
Tags
----
TagId (Primary Key)
BlogPostTags
------------
BlogPostId (Foreign Key)
TagId (Foreign Key)
以及 Fluent NHibernate 映射的近似值:
public class BlogPostMap : ClassMap<BlogPost>
{
public BlogPostMap()
{
// ...
HasManyToMany(post => post.Tags)
.Table("BlogPostTags")
.ChildKeyColumn("TagId")
.ParentKeyColumn("BlogPostId")
.AsSet()
.Access.CamelCaseField()
.Cascade.All();
}
}
如何在不对 table 名称进行硬编码且不启用级联删除的情况下删除 "BlogPostTags" table 中的记录?
您可以从配置中获取table名称
Configuration config = ...
var collection = (Collection)config.GetClassMapping(typeof(BlogPost)).GetProperty("Tags").Value;
var tablename = collection.CollectionTable.GetQualifiedName(Dialect.GetDialect(config.Properties));
我正在尝试删除 NHibernate 中映射 table 的所有记录,作为通过浏览器进行功能测试设置的一部分。从其他问题中,我得到了所有映射的 classes 的 class 元数据,这让我得到了 table 名称。从那里我正在对数据库执行 SQL 删除语句。这工作得很好,除了我有一个连接 table 不是直接映射的,而是作为多对多关系的一部分映射的。
正是这个table,多对多的关系,我需要弄清楚,但我不知道该怎么做。虽然我不能 post 确切的映射,但这里是数据库模式的近似值:
BlogPosts
---------
BlogPostId (Primary Key)
Tags
----
TagId (Primary Key)
BlogPostTags
------------
BlogPostId (Foreign Key)
TagId (Foreign Key)
以及 Fluent NHibernate 映射的近似值:
public class BlogPostMap : ClassMap<BlogPost>
{
public BlogPostMap()
{
// ...
HasManyToMany(post => post.Tags)
.Table("BlogPostTags")
.ChildKeyColumn("TagId")
.ParentKeyColumn("BlogPostId")
.AsSet()
.Access.CamelCaseField()
.Cascade.All();
}
}
如何在不对 table 名称进行硬编码且不启用级联删除的情况下删除 "BlogPostTags" table 中的记录?
您可以从配置中获取table名称
Configuration config = ...
var collection = (Collection)config.GetClassMapping(typeof(BlogPost)).GetProperty("Tags").Value;
var tablename = collection.CollectionTable.GetQualifiedName(Dialect.GetDialect(config.Properties));