C#如何通过向其添加属性来扩展存在于不同dll中的类?

时间:2015-06-18 06:20:44

标签: c# entity-framework dbcontext

我有n层应用程序,在不同的程序集中有许多层。 我使用实体框架6.1,我想将ObjectState属性添加到基本实体以跟踪实体状态。问题是BaseEntity位于我的域对象dll中,它与数据库无关,我想在Entity Framework项目中添加ObjectState,因为此属性与实体框架相关。如何实现此行为?

public enum ObjectState
{
    Unchanged,
    Added,
    Modified,
    Deleted
}
public interface IObjectState
{
    [NotMapped]
    ObjectState ObjectState { get; set; }
}

2 个答案:

答案 0 :(得分:2)

如果您可以编辑域对象项目的代码并将基本实体声明为部分类,则可以使用partial classes

namespace DomainNameSpace 
{
    public partial class BaseEntity
    {
        // Your properties and method
    }
}

然后在您的Entity Framework项目中,您可以添加以下代码:

namespace DomainNameSpace 
{
    public partial class BaseEntity
    {
        public enum ObjectState
        {
            Unchanged,
            Added,
            Modified,
            Deleted
        }
        public interface IObjectState
        {
            [NotMapped]
            ObjectState ObjectState { get; set; }
        }
    }
}

或者如果你不能编辑域项目中的文件或者不喜欢这种方法,那么继承可能有所帮助。在您的Entity Framework项目中,创建如下所示的类。

namespace YourProjectNameSpace 
{
    public class StatefulEntityClassName : BaseEntity
    {
        public enum ObjectState
        {
            Unchanged,
            Added,
            Modified,
            Deleted
        }
        public interface IObjectState
        {
            [NotMapped]
            ObjectState ObjectState { get; set; }
        }
    }
}

希望得到这个帮助。

答案 1 :(得分:0)

如果您的意思是,您无法在IObjectState中实施BaseEntity,因为它必须独立于EF特定,那么您应该有两组实体 - 一组用于域,一组对于EF,并在这些集合之间使用映射(可能是Automapper):

// domain entities assembly
public abstract class BaseEntity { }

// EF entities assembly
public abstract class BaseEFEntity : IObjectState

// somewhere in the code
Mapper.Map(domainEntity, efEntity);

实际上,当使用分层架构时,当每个层运行其特定模型时,这是一种更好的方式。