Ef Core 2.2和强类型ID属性上的外键

时间:2019-01-15 10:28:04

标签: entity-framework ef-core-2.1 ef-core-2.2

我想在两个实体之间创建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类型的转换。

您知道这种情况下的任何解决方法或标准解决方案吗?由于持久层的限制,我不想在域中进行更改。

0 个答案:

没有答案