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

C#如何通过添加属性来扩展存在于不同dll中的类?,c#,entity-framework,dbcontext,C#,Entity Framework,Dbcontext,我有一个n层应用程序,它在不同的程序集中有许多层。 我使用EntityFramework6.1,我想向基础实体添加ObjectState属性来跟踪实体状态。问题是BaseEntity位于独立于数据库的域对象dll中,我想在实体框架项目中添加ObjectState,因为此属性与实体框架相关。如何实现此行为 public enum ObjectState { Unchanged, Added, Modified, Deleted } public interface

我有一个n层应用程序,它在不同的程序集中有许多层。 我使用EntityFramework6.1,我想向基础实体添加
ObjectState
属性来跟踪实体状态。问题是
BaseEntity
位于独立于数据库的域对象dll中,我想在实体框架项目中添加
ObjectState
,因为此属性与实体框架相关。如何实现此行为

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

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

// domain entities assembly
public abstract class BaseEntity { }

// EF entities assembly
public abstract class BaseEFEntity : IObjectState

// somewhere in the code
Mapper.Map(domainEntity, efEntity);
实际上,当使用分层体系结构时,当每个层操作其特定模型时,这是一种更好的方法。

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

namespace DomainNameSpace 
{
    public partial class BaseEntity
    {
        // Your properties and method
    }
}
然后,您可以在实体框架项目中添加以下代码:

namespace DomainNameSpace 
{
    public partial class BaseEntity
    {
        public enum ObjectState
        {
            Unchanged,
            Added,
            Modified,
            Deleted
        }
        public interface IObjectState
        {
            [NotMapped]
            ObjectState ObjectState { get; set; }
        }
    }
}
或者,如果您不能在域项目中编辑文件,或者不喜欢这种方法,继承可能会有所帮助。在实体框架项目中,创建如下所示的类

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

希望有帮助。

如果该类是公共的,而不是密封的,那么继承有什么问题?我想我遗漏了什么。问题是
NotMapped
属性吗?您可以使用EF的fluent配置来确保属性不被映射吗?您好,我不想将属性ObjectState添加到我的基本实体中,因为这是我的域的基础,此属性是实体框架特定的。谢谢您的帮助,但这将添加另一层,因为我已经有Dto层等等,将增加应用程序库的复杂性,但分部类必须位于同一项目(dll)中