【问题标题】:Using base class for object creates problems for EF4.1 POCO对对象使用基类会给 EF4.1 POCO 带来问题
【发布时间】:2011-06-20 12:49:29
【问题描述】:

在一个新项目中,我想使用实体框架的“代码优先”功能来设置我的数据存储。

在我的项目中,我可能有多种类型的人(持票人、旅行者、销售代理等),但我只想验证持票人。所以我创建了一个“Person”类型的基类,它没有验证属性和一个“TicketHolder”类型的继承类,其中包含对名字等的验证。

我的问题是 EF 抛出异常:

在模型生成过程中检测到一个或多个验证错误: System.Data.Edm.EdmProperty:名称:类型中的每个属性名称都必须是唯一的。属性名称“标题”已定义。

看起来 EF 没有识别出“TicketHolder”的属性会覆盖“Person”的属性。

我该如何解决这个问题?

基类:

public abstract class Person
{
    public int Id { get; set; }
    public virtual string Title { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public DateTime DateOfBirth { get; set; }
}

TicketHolder 的派生类:

public class TicketHolder : Person
{
    [Required(ErrorMessage = "Title Required")]
    public override string Title { get; set; }

    [Required(ErrorMessage = "First Name Required")]
    public override string FirstName { get; set; }

    [Required(ErrorMessage = "Last Name Required")]
    public override string LastName { get; set; }

}

【问题讨论】:

    标签: c# entity-framework poco code-first


    【解决方案1】:

    尝试abstract 而不是virtual

        public abstract class Person {
            public int Id { get; set; }
            public abstract string Title { get; set; }
            public abstract string FirstName { get; set; }
            public abstract string LastName { get; set; }
            public DateTime DateOfBirth { get; set; } 
        }
    

    您也可以考虑使用 MetadataTypeAttribute 将元数据与实体分开。

    【讨论】:

    • 嗨 Jakub...我使用了 virtual,因为如果我创建另一个派生类,我就不需要实现 Title、FirstName 和 LastName 属性。
    • @FloatLeft - 你应该使用 MetadataTypeAttribute 创建一个“元数据伙伴类”
    猜你喜欢
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 2017-05-29
    • 1970-01-01
    • 2016-01-12
    相关资源
    最近更新 更多