.net 公共字段的导航属性

.net 公共字段的导航属性,.net,entity-framework,entity-framework-6,.net-4.5.2,.net,Entity Framework,Entity Framework 6,.net 4.5.2,在我的模型中,我有一些出现在多种类型上的属性。例如,许多类型都有CreatedByUserId和CreatedDate。可以更新的类型具有LastUpdatedByUserId和lastUpdateDate 我的第一个想法是使用复杂类型来封装这些字段,以使映射更容易。但是,如下所述,复杂类型不能具有导航属性,因此在我的实体上没有CreatedByUser 一个选项是使用基类,但现在我需要3个,仅CreatedBy,仅LastUpdatedBy,以及两者。更不用说这是几个场景中的一个,这可能会

在我的模型中,我有一些出现在多种类型上的属性。例如,许多类型都有
CreatedByUserId
CreatedDate
。可以更新的类型具有
LastUpdatedByUserId
lastUpdateDate

我的第一个想法是使用复杂类型来封装这些字段,以使映射更容易。但是,如下所述,复杂类型不能具有导航属性,因此在我的实体上没有
CreatedByUser

一个选项是使用基类,但现在我需要3个,仅CreatedBy,仅LastUpdatedBy,以及两者。更不用说这是几个场景中的一个,这可能会导致大量的基类,这感觉是错误的


我是否要咬紧牙关,在每种类型上定义这些属性?有更好的方法来处理这个问题吗?

创建一个要从中继承的类 下面将把BasicBO中的属性放在myclassas和MyClass2s表中

public类Model1Context:DbContext
{
公共模型1上下文()
:base(“name=Model1”)
{
SetInitializer(新的Model1Initializer());
}
公共虚拟数据库集myclassas{get;set;}
公共虚拟数据库集MyClass2s{get;set;}
}
公共类Model1Initializer:DropCreateDatabaseIfModelChanges
{
}
公共类MyClass1:BasicBO
{
公共字符串MyClassStuff{get;set;}
}
公共类MyClass2:BasicBO
{
公共字符串MyClass2Stuff{get;set;}
}
公共类BasicBO
{
公共int Id{get;set;}
公共虚拟用户CreatedByUser{get;set;}//或其他任何内容
}

这里有一个对我们有效的方法:@SteveGreene这看起来是一个非常好的模式。不幸的是,我尝试做的不仅仅适用于跟踪字段。我只是把它作为一个大家都能理解的简单例子。
public class Model1Context : DbContext
{
    public Model1Context()
        : base("name=Model1")
    {
        Database.SetInitializer(new Model1Initializer());
    }
    public virtual DbSet<MyClass1> MyClass1s { get; set; }
    public virtual DbSet<MyClass2> MyClass2s { get; set; }
}
public class Model1Initializer : DropCreateDatabaseIfModelChanges<Model1Context>
{
}
public class MyClass1 : BasicBO
{
    public string MyClass1Stuff { get; set; }
}
public class MyClass2 : BasicBO
{
    public string MyClass2Stuff { get; set; }
}
public class BasicBO
{
    public int Id { get; set; }
    public virtual User CreatedByUser { get; set; }  // or whatever
}