EF码第一id被映射为FK

本文关键字:映射 FK id EF | 更新日期: 2023-09-27 17:50:05

假设我有一个Article和一个FeatureArticle,其中FeatureArticle指向Article本身、Order和它自己的Id。现在EF只是简单地将Id设置为文章的Id。不管出于什么原因,这意味着我不能添加多个FeatureArticles(指向不同的文章)。

配置如下:

public sealed class FeatureArticleMap : EntityTypeConfiguration<FeatureArticle>
{
    public FeatureArticleMap()
    {
        HasKey(o => o.Id);
        Property(o => o.Order).IsRequired();
        HasRequired(o => o.Article).WithRequiredPrincipal().WillCascadeOnDelete();
    }
}
public sealed class ArticleMap : EntityTypeConfiguration<Article>
{
    public ArticleMap()
    {
        HasKey(o => o.Id);
        Property(o => o.Name).IsRequired().HasMaxLength(255);
        Property(o => o.Content).IsRequired();
    }
}

那么EF正在写这样的条目(id为5以演示这一点):

Article:
Id: 5, Name: "Some Article", Content: "Blah"
FeatureArticle:
Id: 5, Order: 0, ArticleId: 0

我期望的文章id是5。好的事情是EF返回我所期望的,但后来它被打破了,因为我不能添加多个FeatureArticle,我怀疑这与它映射Id的方式有关。

EF码第一id被映射为FK

在类似的情况下,我的表中有一个单独的FK- id, FK定义是不同的。我不知道下面这个FK的定义是否符合你的需求。

结合你的代码,它看起来像
模型:

public partial class FeatureArticle
{
    public int Id { get; set; }
    public int Order { get; set; }
    public int ArticleId { get; set; }
    public virtual Article Article { get; set; }
}
public partial class Article
{
    public Article()
    {
        this.FeatureArticles = new List<FeatureArticle>();
    }
    public int Id { get; set; }
    public string Name { get; set; }
    public string Content { get; set; }
    public virtual ICollection<FeatureArticle> FeatureArticles { get; set; }
}

映射:

public sealed class FeatureArticleMap : EntityTypeConfiguration<FeatureArticle>
{
    public FeatureArticleMap()
    {
        // Primary Key
        HasKey(o => o.Id);
        // Properties
        Property(o => o.Order).IsRequired();
        // Table & Column Mappings
        ToTable("FeatureArticle");
        Property(o => o.Id).HasColumnName("Id");
        Property(o => o.Order).HasColumnName("Order");
        Property(o => o.ArticleId).HasColumnName("ArticleId");
        // Relationships
        HasRequired(o => o.Article)
            .WithMany(o => o.FeatureArticles)
            .HasForeignKey(d => d.ArticleId);
    }
}
public sealed class ArticleMap : EntityTypeConfiguration<Article>
{
    public ArticleMap()
    {
        // Primary Key
        HasKey(o => o.Id);
        // Properties
        Property(o => o.Name).IsRequired().HasMaxLength(255);
        Property(o => o.Content).IsRequired();
        // Table & Column Mappings
        ToTable("Article");
        Property(o => o.Name).HasColumnName("Name");
        Property(o => o.Content).HasColumnName("Content");
    }
}

我需要提到的是,我在表中使用的这个FK约束是用EF设计器建模的,然后首先用实体框架电动工具Beta 4转换为代码。