Entity Framework 代码优先:如何忽略 类

Entity Framework code first: How to ignore classes

这与问题 here and here 类似,但这些都是旧问题,没有好的答案。

假设我有以下 classes:

class HairCutStyle { 
   public int ID { get; set; }
   public string Name { get; set; }
}

class CustomerHairCutPreference {
   public int ID { get; set; }
   public Customer Customer { get; set; }
   public HairCutStyle HairCutStyle { get; set; }
}

假设我的 HairCutStyle 数据存储在另一个数据库的 table 中(我是从 Paul Mitchell 自己那里得到的)。我想将 HairCutStyle class 用作 POCO class - 我将在代码中使用它来表示理发样式,但我不需要 read/write 我的数据库中的信息. (假设我有一个单独的服务层,可以从其他数据库为这些 classes 填充数据。)

如何告诉 EF 不要在我当前的数据库上下文中创建 HairCutStyle table?但与此同时,我想在 CustomerHairCutPreference table 中存储一个值,该值是对存储在别处的 HairCutStyle 数据的引用。 "virtual" 某种外键,不受实际数据库 FK 约束的约束。

CustomerHairCutPreference 中为 HairCutSytleID 添加一个 属性,然后在 HairCutStyle 属性 上使用 [NotMapped] 属性。但是请注意,您将负责确保 HairCutStyleHairCutStyleID 保持同步。

class CustomerHairCutPreference {
   public int ID { get; set; }
   public Customer Customer { get; set; }
   public int HairCutStyleID {get; set; }

   [NotMapped]
   public HairCutStyle HairCutStyle { get; set; }
}

或者,您可以使用 FluentAPI 将 HairCutStyle 完全排除在 Entity Framework 映射之外,如果您有多个 类 link,这可能会很有用

protected override void OnModelCreating(DbModelBuilder modelBuilder) {
    modelBuilder.Ignore<HairCutStyle>();
}

要确保三件事:

  1. 确保您没有在 DbContext 派生的 class
  2. 中公开 DbSet<HairCutStyle>
  3. 确保您在 OnModelCreating 覆盖
  4. 中没有提及 HairCutStyle
  5. 使用 NotMapped 属性标记您的 HairCutStyle 属性。