【问题标题】:Ignore some inherited properties in EF6 code first mapping(.NET4 not .NET4.5)忽略 EF6 代码优先映射中的一些继承属性(.NET4 不是 .NET4.5)
【发布时间】:2014-06-25 16:05:45
【问题描述】:

我在 win Form 项目中首先使用 .NET4 的 EF6 代码(我应该在 win xp 上交付项目,所以我无法使用 .NET4.5 对其进行配置)。

我有一个 BaseEntity 类,所有其他实体都继承自它:

public abstract class BaseEntity
{
    public int Id {get; set;}
    public int X {get; set;} 
    public int Y {get; set;} 
}  
public class Calendar:BaseEntity
{
    // properties    
}

如何在不为每个实体编写以下代码的情况下忽略所有实体中的 X、Y 属性?

   modelBuilder.Entity<Calendar>()
            .Ignore(t => t.X)
            .Ignore(t => t.Y)

请注意,我无法使用 [NotMapped] 属性,因为我将 EF6 与 .NET 4 一起使用。

【问题讨论】:

    标签: c# entity-framework .net-4.0 ef-code-first mapping


    【解决方案1】:

    使用EntityTypeConfigurations 代替modelBuilder.Entity&lt;&gt;

    abstract class BaseEntityMapping : EntityTypeConfiguration<BaseEntity>
    {
        public BaseEntityMapping()
        {
            this.Ignore(t => t.X);
            this.Ignore(t => t.Y);
        }
    }
    
    class CalendarMapping : BaseEntityMapping
    {
        public CalendarMapping()
        {
            // Specific mappings
        }
    }
    

    OnModelCreating:

    modelBuilder.Configurations.Add(new CalendarMapping());
    

    【讨论】:

    • 所以,我必须为每个实体创建映射类。我正在寻找一种解决方案,我写一次,如果可能的话,它适用于所有实体。
    • 每个实体都有映射类会更好。创建它们需要一些时间,但在此之后,如果您想检查或修改特定映射,将永远更容易找到它。否则,我看不到任何可能性。唯一的选择是将属性转换为获取/设置方法。
    • 作为替代(get/set 方法),你的意思是我改变 {get; set;} 得到 { return _field;} set { _field = value}?
    • 编程实体框架:DbContext 作者:Julia Lerman,Rowan Miller,第 6 章:“您的类中可能有不映射到数据库的属性。按照惯例,没有setter 和 getter 都不会成为模型的一部分。这些也称为瞬态属性。”,所以如果我想同时设置和获取,我认为这个解决方案不起作用。
    • 我说的是方法:GetX()、SetX() 等。EF 从不映射方法。但这是一种可能的选择。如果您需要属性 X 和 Y,它可能对您不起作用。数据绑定。那么你最好使用基类来映射类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 2023-03-06
    • 1970-01-01
    • 2011-08-12
    相关资源
    最近更新 更多