0

我将 EF 5 与代码优先方法一起使用。现在我尝试定义一个“代码”表,我希望在其中有几个不同的代码(如地址代码、介质代码等)。在这个表中,我只有以下属性:ID (Guid)、Name (String)、Description (String) 和一个鉴别器(在这种情况下,类似于代码的类型:地址代码、介质代码等)。

所以我定义了以下基类:

public abstract class Code : EntityBase
{
    public string Name { get; set; }
    public string Beschreibung { get; set; }
}

然后我从代码中派生了两个类

public class AddressCode : Code {}
public class MediumCode : Code {}

EntityBase 类是抽象的,只定义了 Id 属性,我们将它用于每个 POCO 类......

目标是我可以使用 AddressCode 作为我的地址 POCO 类的属性:

public class Adresse : EntityBase
{
    #region Properties
    public string Name1 { get; set; }

    public virtual AddressCode AddressCode { get; set; }
    #endregion
}

现在的问题是,我该如何解释 EF 如何做到这一点?任何人都可以帮忙吗?

谢谢马可


感谢您的回答!

我试着按照你说的去做。不幸的是,由于我的 EntityBase 类,我得到了一个错误:

public abstract class EntityBase
{
    #region Properties

    public virtual Guid Id { get; set; }

    public virtual bool IsValid
    {
        get
        {
            {
                return Validate();
            }
        }
    }

    [NotMappedAttribute]
    public virtual IList<ValidationFailure> ValidationFailures { get; set; }

    #endregion

    #region Methods

    private bool Validate()
    {
        var validatorFactory = new AttributedValidatorFactory();
        IValidator validator = validatorFactory.GetValidator(GetType());

        if (validator == null)
        {
            return true;
        }

        ValidationResult validationResult = validator.Validate(this);

        ValidationFailures = validationResult.Errors;

        return validationResult.IsValid;
    }

    #endregion
}

错误消息是:您不能对类型“Entities.AdresseCode”的属性“ValidationFailures”使用 Ignore 方法,因为此类型继承自映射此属性的类型“Entities.EntityBase”。要从模型中排除此属性,请对基本类型使用 NotMappedAttribute 或 Ignore 方法。

如您所见,我已经将属性 ValidationFailures 定义为 NotMapped 但我仍然收到此错误..您有什么想法吗?

谢谢马可

4

2 回答 2

0

只需创建一个上下文(派生自DbContext

public class AddressesDb : DbContext
{
    public DbSet<Code> Codes { get; set; }
    public DbSet<Adresse> Adressen { get; set; }
}

并且(在代码中使用时)EF 将创建一个具有默认表名和列名的数据库。它将创建一个 text( nvarchar) 类型的鉴别器列,其中包含派生自 的类的名称Code

如果您想要不同的名称和/或类型,您应该使用数据注释流式 API来配置这些。

于 2012-11-07T09:01:31.760 回答
0

最后我得到了它的工作!

在 DBContext 中,请注意在所有其他 POCO 之前为代码派生类定义 DbSet,然后它就可以工作了!

于 2012-11-08T07:34:00.567 回答