对来自实体框架中父类的属性使用[NotMapped]

时间:2019-04-24 09:57:22

标签: c# asp.net entity-framework data-annotations

我有这样的硕士基础班。

    public class MasterTemplate
    {
        [Key]
        public int Id { get; set; }

        [StringLength(50)]
        public string Code { get; set; }

        [Required]
        [StringLength(255)]
        public string Description { get; set; }

        public decimal? SortOrder { get; set; }
    }

我有很多继承上述类的类。 例如,姓氏,国籍,货币等。

    public class Nationality : MasterTemplate
    {

        // Other memebers of nationality
    }

    public class Caste: MasterTemplate
    {

        // Other memebers of caste
    }

大多数类都需要所有列,但是我的一些类不需要“ Description”,其中一些不需要“ Code”,另一些不需要“ SortOrder”。

    public class Zone: MasterTemplate
    {
        // Logic to mark Description [NotMapped], 
        // so that EF doesn't create a column in database

        // Other memebers of zone
    }

对于同一个类中的成员,我可以使用[NotMapped],但是如何从子类为父类属性执行此操作。我知道我可以删除继承并做到这一点,但很好奇是否有可能从子类为父类属性进行继承。

编辑:

由@IvanJazz表示,对代码进行了如下修改。


public class MasterTemplate
{
    [Key]
    public int Id { get; set; }

    [StringLength(50)]
    public virtual string Code { get; set; }

    [Required]
    [StringLength(255)]
    public virtual string Description { get; set; }

    public virtual decimal? SortOrder { get; set; }
}

public class Nationality : MasterTemplate
{
    // Code will not appear in Nationality table
    [NotMapped]
    public override string Code { get; set; }
}

public class Zone : MasterTemplate
{
    // Description will not appear in Zone table
    [NotMapped]
    public override string Description { get; set; }
}

现在,从逻辑上讲,实体框架在添加记录时不应该搜索覆盖并标记为NotMapped的属性。插入以下DbValidation时发生错误。不知道为什么实体框架仍在搜索未映射的属性。

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:3)

您可以使用virtualoverride修饰符来获得所需的结果。在派生类中使用virtual属性将所有可选属性标记为override[NotMapped]

public class MasterTemplate
{
    [Key]
    public int Id { get; set; }

    [StringLength(50)]
    public virtual string Code { get; set; }

    [Required]
    [StringLength(255)]
    public virtual string Description { get; set; }

    public virtual decimal? SortOrder { get; set; }
}

public class Nationality : MasterTemplate
{
    // Code will not appear in Nationality table
    [NotMapped]
    public override string Code { get; set; }
}

public class Zone : MasterTemplate
{
    // Description will not appear in Zone table
    [NotMapped]
    public override string Description { get; set; }
}