我想在两个实体之间创建one-to-many
关系。假设非常简单,我想在Blog
对象上收集帖子,并在Post
上添加博客ID。
public class Blog
{
public int Id { get; private set;}
public virtual ICollection<Post> Posts { get; private set; }
public Blog(BlogId id) {
Id = id.Id;
}
}
public class Post
{
public int Id { get; private set;}
public virtual BlogId BlogId { get; private set; }
}
public class BlogId: IComparable<int>
{
public int Id { get; private set; }
public BlogId(int id)
{
Id = id;
}
public static implicit operator int(BlogId id) => id.Id;
public static implicit operator BlogId(int id) => new BlogId(id);
public int CompareTo(int other) => Id.CompareTo(other);
}
配置:
public class BlogConfiguration : IEntityTypeConfiguration<Blog>
{
public void Configure(EntityTypeBuilder<Blog> builder)
{
builder.ToTable("Blogs");
builder.HasKey("Id");
builder.HasMany(n => n.Posts)
.WithOne()
.HasForeignKey(p => p.BlogId)
.IsRequired()
.OnDelete(DeleteBehavior.Cascade);
}
}
public class PostConfiguration : IEntityTypeConfiguration<Post>
{
public void Configure(EntityTypeBuilder<Post> builder)
{
builder.ToTable("Posts");
builder.HasKey("Id");
builder.Property(p => p.BlogId)
.HasConversion(v => v.Id, v => new BlogId(v));
}
}
不幸的是,它不适用于强类型Id对象。在这种情况下,我们会得到一个例外:
具有外键属性{'BlogId':BlogId}的从'Post'到'Blog.Posts'的关系不能针对主键{'Id':int},因为它不兼容。为此关系配置一个主键或一组兼容的外键属性。
我尝试使用隐式运算符,IComparable接口,自有类型来解决它,但是这些解决方案都不能在这里工作。在关系创建过程(builder.Property(p => p.BlogId).HasConversion(v => v.Id, v => new BlogId(v));
)中,它只是忽略BlogId类型的转换。
您知道这种情况下的任何解决方法或标准解决方案吗?由于持久层的限制,我不想在域中进行更改。