【问题标题】:Entity Framework code first: How to ignore classes实体框架代码优先:如何忽略类
【发布时间】:2015-08-19 01:08:48
【问题描述】:

这类似于herehere 的问题,但这些问题已经过时且没有很好的答案。

假设我有以下课程:

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 数据存储在另一个数据库的表中(我从 Paul Mitchell 本人那里获得)。我想将 HairCutStyle 类用作 POCO 类——我将在代码中使用它来表示理发样式,但我不需要在我的数据库中读取/写入该信息。 (假设我有一个单独的服务层,可以从其他数据库填充这些类的数据。)

如何告诉 EF 不要在我当前的数据库上下文中创建 HairCutStyle 表?但同时,我想在 CustomerHairCutPreference 表中存储一个值,该值是对存储在其他地方的 HairCutStyle 数据的引用。一种“虚拟”外键,不受实际数据库 FK 约束的约束。

【问题讨论】:

标签: c# entity-framework poco dbcontext


【解决方案1】:

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 完全排除在实体框架的映射之外,如果您有多个链接到它的类,这可能会很有用。

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

【讨论】:

  • 您的替代答案非常有帮助。就我而言,我正在开发一个将 EF 用于现有表的项目,但我们不想再对我们添加的新表使用 EF,新表也使用与现有表相同的模式。对于新表,我从 EF 收到“EntityType has no key defined”错误。你的回答帮我解决了,谢谢。
【解决方案2】:

要确保三件事:

  1. 确保不要在 DbContext 派生类中公开 DbSet&lt;HairCutStyle&gt;
  2. 确保在 OnModelCreating 覆盖中没有提及 HairCutStyle
  3. 使用NotMapped 属性标记您的HairCutStyle 属性。

【讨论】:

  • 为什么需要避免在 DbContext 中暴露DbSet&lt;HairCutStyle&gt;
猜你喜欢
  • 2012-02-12
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
  • 2017-09-01
  • 2014-05-23
相关资源
最近更新 更多