天道酬勤,学无止境

使用 EntityTypeConfiguration 时的抽象域模型基类(Abstract domain model base class when using EntityTypeConfiguration<T>)

问题

获取 Base 对象属性的中央映射是否有一些技巧? 使用 EntityTypeConfiguration 时是否有一些抽象类的简单模式。
非常感谢任何提示。 我无法声明一个类

Public class BaseEntityConfig<T> : EntityTypeConfiguration<T>

类似的问题,我无法获得工作的答案 如何创建和使用通用类 EntityTypeConfiguration<TEntity> 和生成 EntityTypeConfiguration 的动态方式:类型“TResult”必须是不可为空的值类型

public  abstract class BosBaseObject
{
  public virtual Guid Id { set; get; }
  public virtual string ExternalKey { set; get; }
  public byte[] RowVersion { get; set; }
}
  public class News : BosBaseObject
{
    public String Heading { set; get; }
}


public class NewsMap : EntityTypeConfiguration<News>
{
    public NewsMap()
    {
      //Base Object Common Mappings
      // How can we use a central mapping for all Base Abstract properties  


     }
 }
// Something like this but very open to any suggestion....
public class BosBaseEntityConfig<T> : EntityTypeConfiguration<T>
{
  public void BaseObjectMap( )
    { 
        // Primary Key
        this.HasKey(t => t.Id);

        // Properties
        this.Property(t => t.Id).HasDatabaseGeneratedOption(databaseGeneratedOption: DatabaseGeneratedOption.None);

        this.Property(t => t.RowVersion)
            .IsRequired()
            .IsFixedLength()
            .HasMaxLength(8)
            .IsRowVersion();

        //Column Mappings
        this.Property(t => t.Id).HasColumnName("Id");
    }
}
回答1

上面的答案肯定有效,尽管这可能稍微干净一些,并且在 DbContext 中注册配置时具有相同的工作优势。

public abstract class BaseEntity
{
    public int Id { get; set; }
}

public class Company : BaseEntity
{
    public string Name { get; set; }
}

internal class BaseEntityMap<T> : EntityTypeConfiguration<T> where T : BaseEntity
{
    public BaseEntityMap()
    {
        // Primary Key
        HasKey(t => t.Id);
    }
}

internal class CompanyMap : BaseEntityMap<Company>
{
    public CompanyMap()
    {
        // Properties
        Property(t => t.Name)
            .IsRequired()
            .HasMaxLength(256);
    }
}

public class AcmeContext : DbContext
{
    public DbSet<Company> Companies { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new CompanyMap());
    }
}

一天一大早,克里斯蒂安·威廉姆斯和我自己就提出了上述解决方案……

回答2

6小时后,我破解了它。 我认为这是一个相当干净的结果。 诀窍是忘记在派生自 EntityTypeConfiguration 的类中执行所有操作并构建自定义 BaseConfig,然后获取此实例并添加该类的细节。 希望它可以帮助其他人先用摘要做代码......

public  abstract class BosBaseObject
{
  public virtual Guid Id { set; get; }
  public virtual string ExternalKey { set; get; }
  public byte[] RowVersion { get; set; }
}
 public abstract class BosObjectDateManaged   :  BosBaseObject
{
    public DateTimeOffset ValidFrom { set; get; }
    public DateTimeOffset ValidTo { set; get; }
}
public class News : BosObjectDateManaged
{
    public String Heading { set; get; }
}



protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        var conf = new BosBaseEntityConfiguration<News>();//Construct config for Type
        modelBuilder.Configurations.Add( conf );  // this has base mapping now
        var newsConf = new NewsConfiguration(conf); // now the Object specific properties stuff

    }

}
public class BosBaseEntityConfiguration<T> : EntityTypeConfiguration<T> where T : BosBaseObject
{
   public BosBaseEntityConfiguration()
   {
       // Primary Key
       this.HasKey(t => t.Id);

       //// Properties
       this.Property(t => t.Id).HasDatabaseGeneratedOption(databaseGeneratedOption: DatabaseGeneratedOption.None);

       this.Property(t => t.RowVersion)
           .IsRequired()
           .IsFixedLength()
           .HasMaxLength(8)
           .IsRowVersion();

       //Column Mappings
       this.Property(t => t.Id).HasColumnName("Id");
   }
}
 public class NewsConfiguration  
{
    public  NewsConfiguration(BosBaseEntityConfiguration<News> entity)
    {
        // Table Specific & Column Mappings
        entity.ToTable("News2");
        entity.Property(t => t.Heading).HasColumnName("Heading2");
    }
}
回答3

抱歉,我无法发表评论,但我会像你一样只交换这两行

      modelBuilder.Configurations.Add( conf );  // this has base mapping now
      var newsConf = new NewsConfiguration(conf); // now the Object specific properties stuff
   to
       new NewsConfiguration(conf); // now the Object 
       modelBuilder.Configurations.Add( conf );  // this has base mapping now

这有助于 EF 的专业领域。

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Grails 2 抽象域继承问题(Grails 2 abstract domain inheritance issue)
    问题 在 Grails 中使用抽象(或非抽象)继承时,以下内容对我不起作用。 很快,我的继承如下: abstract BaseClass { ... } SomeClass extends BaseClass { ... } SomeOtherClass extends BaseClass { ... } 然后在另一个域对象中: ThirdClass { ... BaseClass baseProperty ... } 但是现在,当我尝试将该属性设置为SomeClass或SomeOtherClass实例时,Grails 包含: 错误 util.JDBCExceptionReporter - 无法添加或更新子行:外键约束失败... 这不可能吗? 我也试过让基类不是抽象的,还试过将SomeClass或SomeOtherClass实例转换为BaseClass 。 它们产生相同的错误。 更新 我刚查过。 它适用于我添加的第一个子类。 但是一旦我尝试添加其他子类,它就会失败。 换句话说: def prop1 = new ThirdClass(baseProperty: instanceOfSomeClass).save() 工作正常。 但是当我尝试这样做时: def prop2 = new ThridClass(baseProperty: instanceOfSomeOtherClass)
  • 如何创建和使用泛型类 EntityTypeConfiguration(How to create and use a generic class EntityTypeConfiguration<TEntity>)
    问题 代码 我的应用程序中有两个非常简单的接口 代表保存在数据库中的实体 public interface IEntity { int Id { get; set; } } 只具有实体Nome字段必填字段保存实体 public interface IEntityName : IEntity { string Nome { get; set; } } 和许多实现这个接口的类 public class Modalidade : IEntityName { public int Id { get; set; } public string Nome { get; set; } } public class Nacionalidade : IEntityName { public int Id { get; set; } public string Nome { get; set; } } public class Profissao : IEntityName { public int Id { get; set; } public string Nome { get; set; } } public class TipoPessoa : IEntityName { public int Id { get; set; } public string Nome { get; set; }
  • 抽象域上的 Grails createCriteria(Grails createCriteria on abstract domain)
    问题 我很好奇人们将如何使用标准构建器来访问继承类的字段。 假设我们有以下类: class A { String fieldOne String fieldTwo static hasMany = [childs: AbstractChildClass] } 抽象子类将如下所示: abstract class AbstractChildClass { Integer valueOne Integer valueTwo A a static mapping tablePerHierarchy false } } 当然有几个扩展类,例如: class ExtendingClassOne extends AbstractChildClass { DesiredObject desiredObject static mapping = { tablePerHierarchy false } } 我们还假设有一个 DesiredObject 类,它看起来像这样: class DesiredObject { String infoA String infoB } 问题是如何通过为 A 类创建条件来获取字段 infoA 和 infoB。到目前为止,我的方法是: A.createCriteria().list { childs { desiredObject { ilike('infoA', '
  • 如何从 Scala 的持久层中抽象域层(How do I abstract the domain layer from the persistence layer in Scala)
    问题 更新:我编辑了标题并添加了此文本以更好地解释我想要实现的目标:我正在尝试从头开始创建一个新应用程序,但不希望业务层了解持久性层,以同样的方式,人们不希望业务层知道 REST API 层。 下面是我想使用的持久层示例。 我正在寻找与此集成的好建议,即我需要设计/架构方面的帮助,以明确划分业务逻辑和持久性逻辑之间的职责。 可能是将持久性对象编组和解组到域对象的概念。 在 SLICK(又名 ScalaQuery)测试示例中,这就是您创建多对多数据库关系的方式。 这将创建 3 个表:a、b 和 a_to_b,其中 a_to_b 保留表 a 和 b 中行的链接。 object A extends Table[(Int, String)]("a") { def id = column[Int]("id", O.PrimaryKey) def s = column[String]("s") def * = id ~ s def bs = AToB.filter(_.aId === id).flatMap(_.bFK) } object B extends Table[(Int, String)]("b") { def id = column[Int]("id", O.PrimaryKey) def s = column[String]("s") def * = id ~ s def as
  • Abstract domain model base class when using EntityTypeConfiguration<T>
    Is there some trick to getting a central mapping of Base object properties? Is there some simple pattern for abstract classes when using EntityTypeConfiguration. ANy tips much appreciated. Im unable to declare a class Public class BaseEntityConfig<T> : EntityTypeConfiguration<T> Similar issues, where i couldnt get the answers to work How to create and use a generic class EntityTypeConfiguration<TEntity> and Dynamic way to Generate EntityTypeConfiguration : The type 'TResult' must be a non-nullable value type public abstract class BosBaseObject { public virtual Guid Id { set; get; } public
  • 无法连接到python中的抽象unix套接字(Can not connect to an abstract unix socket in python)
    问题 我有一个用 C++ 编写的服务器,它创建并绑定到一个抽象的 unix 套接字,命名空间地址为"\0hidden" 。 我也有一个用 C++ 编写的客户端,这个客户端可以成功连接到我的服务器。 顺便说一句,我没有这个客户端的源代码。 现在我正在尝试使用我用 python 编写的客户端连接到我的服务器,但没有成功。 我不明白为什么我的 python 客户端不工作。 我正在发布我的服务器和客户端代码的相关部分。 服务器 #define UD_SOCKET_PATH "\0hidden" struct sockaddr_un addr; int fd,cl; if ( (fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { syslog(LOG_CRIT, "Error creating socket!"); exit(1); } memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; strncpy(addr.sun_path, UD_SOCKET_PATH, sizeof(addr.sun_path)-1); unlink(UD_SOCKET_PATH); if (::bind(fd, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
  • Django抽象模型vs简单Python mixins vs Python ABC(Django Abstract Models vs simple Python mixins vs Python ABCs)
    问题 这是我提出的另一个问题提示的一个问题。 Django提供了Abstract基类功能(与Python中的ABC类不同吗?),因此可以创建一个可以继承的模型(Django的models.Model),但是该模型在数据库中没有实际的表。 通过在模型的Meta类中设置“抽象”属性来触发此行为。 现在的问题是:为什么Django用这种方式解决它? 为什么需要这种特殊的“抽象基类”模型? 为什么不通过仅继承对象类并将其与现有Model混合来进行Model mixin? 还是可以通过Python ABC的任务来做到这一点? (请注意,我对Python中的ABC类不是很熟悉,我的无知可能显示在这里) 回答1 我会尽量简短些,因为这很容易变成冗长的异味: ABC之所以出现是因为它们仅在Python 2.6中引入,并且Django开发人员为Python版本支持制定了一套路线图(2.3支持仅在1.2中下降了)。 至于对象继承混合器,它们在Python方面的作用要比仅仅降低可读性的方式要少。 Django对Model对象使用ModelBase元类,它实际上在初始化时分析定义的模型属性,并使用字段, Meta选项和其他属性填充Model._meta 。 对于两种类型的模型都可以重用该框架。 这也允许Django防止继承模型来覆盖抽象模型字段。 我能想到的原因还有很多,它们全都是次要的
  • 抽象父模型中的 models.E006 - Django 3.1(models.E006 in abstract parent model - Django 3.1)
    问题 我有一个抽象模型和一些继承自它的其他类。 # models.py class Parameter(models.Model): data = integer = models.IntegerField(blank=True, null=True) class Meta: abstract = True class Temperature(Parameter): received_timestamp = models.DateTimeField(default=datetime.now, blank=True) class Ph(Parameter): received_timestamp = models.DateTimeField(default=datetime.now, blank=True) 虽然我的Parameter类是抽象的,但我在python manage.py makemigrations脚本中得到了models.E006错误。 graphs.Temperature.data:(models.E006)字段“data”与模型“graphs.temperature”中的字段“data”冲突。 graphs.Ph.data:(models.E006)字段“data”与模型“graphs.ph”中的字段“data”冲突。 基于抽象基类和这个问题,如果我从抽象基类继承
  • Django-模型层:抽象基类、自定义管理器的使用
    我的Django版本==1.8.2 数据库为mysql 参考文档: django1.8.2–模型继承–抽象基类 django1.8.2—模型管理器 抽象基类 通常,你想使用父模型类来持有一些字段,如创建时间、更新时间等,而不想在每个子模型中都敲一遍。这个父模型类永远不会单独使用,这就是抽象基类。 我使用的案例: 在项目路径下新建python package命名常取’db’,在其中创建base_model.py 代码如下: from django.db import models class BaseModel(models.Model): """模型抽象基类""" create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间') is_delete = models.BooleanField(default=False, verbose_name='删除标记') class Meta: # 说明是一个抽象模型类 abstract = True 编写完基类之后,在 Meta类中设置 abstract=True ,这个模型就不会被用来创建任何数据表。取而代之的是
  • 使用基类和私有设置程序时,关键组件“ Id”不是类型“ TypeName”上的声明的属性(The key component 'Id' is not a declared property on type 'TypeName', when using base class and private setter)
    问题 我想为实体使用抽象基类,该基类未映射到任何表上: public abstract class Entity { public virtual int Id { get; private set; } } 由于Id会自动递增,因此我不想允许从外部更改此属性。 因此,它的设置者是private 。 这是一个示例实体类型: public class Order : Entity { public virtual string Customer { get; set; } } ...配置类型: public class EntityConfiguration<TEntity> : EntityTypeConfiguration<TEntity> where TEntity : Entity { public EntityConfiguration() { HasKey(o => o.Id); Property(o => o.Id).HasColumnName("id").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); } } public class OrderConfiguration : EntityConfiguration<Order> { public OrderConfiguration() {
  • Django 中的抽象基类模型与代理模型(Abstract base class model vs Proxy model in Django)
    问题 我正在构建一个控制面板,它将在 Django 中有多个子应用程序。 我的模型之一是application ,它将具有重要的设置,例如name 、 description 、 install_path和id (以便我可以将特定设置和配置值与该应用程序相关联。 现在我正在努力弄清楚如何声明这个特定的模型。 每个application将做一些与其他应用程序完全不同的事情。 一个可能管理特定的 CMS 设置,另一个可能为我们的开发环境处理密码重置。 目标是在一个地方获得常见的支持项目。 每个应用程序的主要信息将相同。 每个都有名称、描述等。不同之处在于它们的作用和使用的设置。 这些设置在它们自己的模型中,通过外键链接回应用程序。 我不确定哪种模型类型最适合我的用例。 两者看起来都有用,但如果是这样,我假设我错过了其中一个(或两个)的一个方面。 我的问题是,使用抽象基类模型与代理模型声明我的application什么区别? 回答1 8个月来没有人碰过这个。 我应该知道得更好,但我要试一试。 显然,您的第一个选择是根本不使用基类并在每个模型上复制您的字段。 我知道你没有问这个问题,但对于看这篇文章的其他人来说,这是初学者的好方法。 这很容易,模型的所有内容都列在一个地方,而不是指向位于代码中其他字段的另一个模型。 抽象基类可能是下一个最简单和最常用的。
  • Neo4j-Ogm 用于动态域对象模型(Neo4j-Ogm for dynamic domain object model)
    问题 我已经开始在我的应用程序中使用 Neo4j-ogm,它的作用就像固定对象域模型的魅力。 当我知道哪个节点类型连接到另一个具有已知类型的节点时 - 它可以轻松映射。 然而,在我看来,Neo4j 图形数据库的多功能性还在于能够使用非类型化(或动态)域模型,并且我在理解如何使用 Neo4j-ogm 实现它时遇到了概念问题。 让我用一个例子来描述我的问题。 我有域对象,如:消息和功能。 其中 Message 可以有多个功能,一个 Feature 可以是许多消息的一部分。 用 Neo4j-ogm 映射完全没问题。 那么如果用户想要将消息与某个任务节点类型相关联或将其引用到某个联系人节点类型呢? 在我的应用程序中,可以在各种类型的节点之间建立大量(但有限)的连接集。 所以我希望能够从特定节点获取所有类型的连接,而不管这种连接类型或 endNode 类型如何? 当然,我可以使用 cypher 来创建这样的连接: MATCH ($2911) WHERE id($2911)={$2911} MATCH ($2912) WHERE id($2912)={$2912} MERGE ($2911)-[_0:`part_of` {$aid} ]->($2912) RETURN id(_0) AS _0 但是当我开始这样做时 - 我需要一种方法来自己转换这个查询的结果和关系实体。
  • 使用通知模式进行域验证(Domain validation using the notification pattern)
    问题 从历史上看,我在对象的构造函数中对我的对象进行了验证,并在验证失败时抛出异常。 例如: class Name { const MIN_LENGTH = 1; const MAX_LENGTH = 120; private $value; public function __construct(string $name) { if (!$this->isValidNameLength($name)) { throw new InvalidArgumentException( sprintf('The name must be between %d and %d characters long', self::MIN_LENGTH, self::MAX_LENGTH) ); } $this->value = $name; } public function changeName(string $name) { return new self($name); } private function isValidNameLength(string $name) { return strlen($name) >= self::MIN_LENGTH && strlen($name) <= self::MAX_LENGTH; } } 虽然我喜欢这种方法
  • Entity Framework 4.1 RC:Code First EntityTypeConfiguration 继承问题(Entity Framework 4.1 RC: Code First EntityTypeConfiguration inheritance issue)
    问题 我正在尝试使用一个通用的 EntityTypeConfiguration 类来为我的所有实体配置主键,以便每个派生的配置类不会重复自己。 我的所有实体都实现了一个通用接口 IEntity(它表示每个实体必须具有一个 int 类型的 Id 属性)。 我的配置基类如下所示: public class EntityConfiguration<TEntity> : EntityTypeConfiguration<TEntity> where TEntity : class , IEntity { public EntityConfiguration() { HasKey( e => e.Id ); Property( e => e.Id ).HasDatabaseGeneratedOption( DatabaseGeneratedOption.Identity ); } } 然后每个实体都有它自己的特定配置类,像这样扩展这个类: public class CustomerConfiguration : EntityConfiguration<Customer> { public CustomerConfiguration() : base() { // Entity specific configuration here } } 它编译得很好,但我遇到的问题是,在运行时,当 EF 4
  • 视图模型继承和重复模型引用(viewmodel inheritance and duplicate model references)
    问题 我的问题是:如何管理视图模型的继承链? 我的情况: 我有一个标准的ViewModelBase ,它只实现了 INotifyPropertyChanged 接口。 此外,我有一个具有 Guid 的BusinessObjectViewModel ,一个具有人员核心数据的PersonBaseViewModel ,一个包含客户相关内容的CustomerViewModel和一个包含员工相关内容的EmployeeViewModel 。 所有的视图模型肯定都封装了一个模型对象(Customer、Employee、PersonBase)。 BusinessObjectViewModel 继承自 ViewModelBase PersonBaseViewModel 继承自 BusinessObjectViewModel CustomerViewModel 继承自 PersonBaseViewModel EmployeeViewModel 继承自 PersonBaseViewModel 模型通过构造函数进入视图模型。 如果我使用构造函数链(每个视图模型都调用基本构造函数),每个视图模型都有它的模型来从模型返回封装的值。 但是我必须在每个视图模型中都有一个 Model 属性。 在 CustomerViewModel 的情况下,我将在CustomerViewModel 中有一个引用,一个在
  • 使用领域驱动设计与实体框架聚合根(Aggregate root with Entity Framework using Domain Driven Design)
    问题 我正在使用使用实体框架的域驱动设计构建应用程序。 我的目标是允许我的域模型(通过 EF 持久化)在其中包含一些逻辑。 开箱即用,实体框架对于实体如何添加到图形然后持久化非常没有限制。 以我的域为 POCO 为例(没有逻辑): public class Organization { private ICollection<Person> _people = new List<Person>(); public int ID { get; set; } public string CompanyName { get; set; } public virtual ICollection<Person> People { get { return _people; } protected set { _people = value; } } } public class Person { public int ID { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public virtual Organization Organization { get; protected set; } } public class
  • Protobuf-net 创建带有接口和抽象基类的类型模型(Protobuf-net creating typemodel with interface and abstract baseclass)
    问题 我正在尝试使用伟大的 Protobuf-NET 序列化模型。 我不能使用属性(对象在编译时是未知的),所以我构造了一个 TypeModel。 我的对象模型由一个类TestDataObject 组成,这个类有一个ITestDataExtension属性。 抽象基类TestDataExtensionBase实现了这个接口,类TestDataExtension (代码中的myDataObjectExtA)继承自这个基类。 我的 TypeModel 是这样构造的: System.IO.MemoryStream tmpMemoryStream = new System.IO.MemoryStream(); RuntimeTypeModel model = TypeModel.Create(); MetaType basetype = model.Add(typeof(TestDataObject), true); MetaType interfaceType = model.Add(typeof(ITestDataExtension), true); //MetaType extBaseType = interfaceType.AddSubType(100, typeof(TestDataExtensionBase)); MetaType extType = interfaceType
  • 面向对象设计工作簿(对象模型域、系统序列图、交互图)(Workbook on object oriented design (object model domain, system sequence diagrams, interaction diagrams))
    问题 虽然我在面向对象理论方面有一定的基础,并且知道如何在没有大麻烦的“进化”设计中构建像俄罗斯方块/井字游戏这样简单的东西,但我想学习如何采取完全不同的方式首先设计系统然后只有他们尝试实施它的方法。 我正在寻找可以教我如何解决问题(例如,井字游戏)并学习如何进行 uml 设计(对象域模型 -> 系统序列图,最后是通信图)的东西。 我正在寻找类似工作簿之类的东西,其中包含一些理论、示例、练习和解决方案(如果可能)。 我知道人们通常推荐 UML 和模式,但我在我的 OO 课程中学习过它并发现它很糟糕。 回答1 Martin Fowler 著名的咖啡机问题。 咖啡机另一个看无需过程代码即可解决的有趣问题 Jeff Bay 在这篇文章中提到:OOD / OOP 练习曲 / 代码练习解释了解决方案的问题。 这是非常好的 最后特地买这本书,因为它对GRASP原理的处理
  • 使用 Django 为抽象基类设置外键(Setting up a foreign key to an abstract base class with Django)
    问题 我已经将两个类的公共属性分解为一个抽象基类,但是我有另一个模型需要引用这些类中的任何一个。 无法引用 ABC,因为它实际上没有数据库表。 下面的例子应该说明我的问题: class Answer(models.Model): ovramt = models.ForeignKey("Ovramt") question = models.ForeignKey("Question") answer = models.CharField(max_length=3, choices=(("yes","yes"),("no","no") ("NA","N/A")) likelihood = models.IntegerField(choices=LIKELY_CHOICES) consequence = models.IntegerField(choices=CONSEQUENCE_CHOICES) class Meta: abstract = True class Answer_A(Answer): resident = models.ForeignKey("Resident") def __unicode__(self): return u"%s - %s - %s" %(self.ovramt.ssa.name, self.resident, self.question) class
  • Zend框架中的模型(Models in the Zend Framework)
    问题 您在Zend框架中实现模型的方式有哪些? 我已经看过基本class User extends Zend_Db_Table_Abstract ,然后在您的控制器中进行了调用: $foo = new User; $foo->fetchAll() 但是更复杂的用途呢? 文档的“快速入门”部分提供了这样的示例,但我仍然觉得我没有得到Zend Framework中模型的“最佳使用”示例。 有什么有趣的实现吗? 编辑:我应该澄清(以回应CMS的评论)...我知道做更复杂的选择。 我对模型概念的整体方法以及其他人如何实现它们的具体示例感兴趣(基本上是手册中遗漏的内容以及基本操作方法的内容) 回答1 我个人同时Zend_Db_Table_Abstract和Zend_Db_Table_Row_Abstract 。 我和您的代码之间的主要区别是,将Zend_Db_Table_Abstract的子类显式地视为“表”,而将Zend_Db_Table_Row_Abstract的子类视为“行”。 我很少看到在控制器中直接调用选择对象,SQL或内置ZF数据库方法的调用。 我试图隐藏请求特定记录以在Zend_Db_Table_Abstract后面进行调用的逻辑,如下所示: class Users extends Zend_Db_Table_Abstract { protected $_name =