Fluent nhibernate 有两个ContentTypeRecords相互了解

Fluent nhibernate 有两个ContentTypeRecords相互了解,fluent-nhibernate,orchardcms,Fluent Nhibernate,Orchardcms,考虑我需要ProductPartRecord类型和ManufacturerPartRecord类型的情况。 在第一种类型中,我需要知道谁是此部件的制造商,因此使用ManufacturerPartRecord类型的属性会很方便。 在第二种类型中,我想知道该制造商生产的产品,因此拥有IList类型的属性是很方便的 显然,这是一种1对多的关系。 将记录放入记录中是一种不好的做法吗?这是否可能,因为我在实现它时遇到了困难?这是可能的。下面是如何做到这一点: 在迁移中,向ProductPartRecord

考虑我需要ProductPartRecord类型和ManufacturerPartRecord类型的情况。 在第一种类型中,我需要知道谁是此部件的制造商,因此使用ManufacturerPartRecord类型的属性会很方便。 在第二种类型中,我想知道该制造商生产的产品,因此拥有IList类型的属性是很方便的

显然,这是一种1对多的关系。
将记录放入记录中是一种不好的做法吗?这是否可能,因为我在实现它时遇到了困难?

这是可能的。下面是如何做到这一点:

  • 在迁移中,向
    ProductPartRecord
    添加一列,该列的类型为
    int
    ,名称应为
    ManufacturerPartRecord\u Id
    ,假设
    Id
    ManufacturerPartRecord
    表中主键的名称
  • 在迁移中创建外键。它应该看起来像这样
    schemabilder.CreateForeignKey(“产品制造商”,“产品零件记录”,新[]{“制造商零件记录”\u Id},“制造商零件记录”,新[]{“Id”})
  • ManufacturerPartRecord
    model类中,您应该添加一个新属性,用于产品列表-
    public virtual IList ProductPartRecords{get;set;}
  • ProductPartRecord
    model类中,您应该添加一个新属性,用于获取manufacturer-
    公共虚拟ManufacturerPartRecord ManufacturerPartRecord{get;set;}
  • 现在应该全部设置为自动获取产品的制造商,反之亦然


    如果您不希望这种情况自动发生,您应该创建一个服务类,该类将通过构造函数注入获取
    IRepository
    IRepository
    ,并自己处理获取和保存列表。

    这是可能的。下面是如何做到这一点:

  • 在迁移中,向
    ProductPartRecord
    添加一列,该列的类型为
    int
    ,名称应为
    ManufacturerPartRecord\u Id
    ,假设
    Id
    ManufacturerPartRecord
    表中主键的名称
  • 在迁移中创建外键。它应该看起来像这样
    schemabilder.CreateForeignKey(“产品制造商”,“产品零件记录”,新[]{“制造商零件记录”\u Id},“制造商零件记录”,新[]{“Id”})
  • ManufacturerPartRecord
    model类中,您应该添加一个新属性,用于产品列表-
    public virtual IList ProductPartRecords{get;set;}
  • ProductPartRecord
    model类中,您应该添加一个新属性,用于获取manufacturer-
    公共虚拟ManufacturerPartRecord ManufacturerPartRecord{get;set;}
  • 现在应该全部设置为自动获取产品的制造商,反之亦然


    如果您不希望这种情况自动发生,您应该创建一个服务类,该类将通过构造函数注入获取
    IRepository
    IRepository
    ,并自己处理获取和保存列表。

    这是非常有说明性的。我还有一个问题。最后一段是否替换步骤“2”,或者必须以任何方式创建外键。我这样问是因为在我看到的pluralsight的Advanced Orchard课程中,关系是在没有fk的情况下创建的,而不是一个包含两个记录ID的表(对于ref,请参见repo中的UpdateFrom5()),它是可选的。如果创建外键,它将在数据库中创建,数据库本身将强制执行它,这意味着如果您尝试向某些产品添加尚不存在的ManufacturerId,或者尝试删除某些产品仍在使用其ID的制造商,它将抛出错误。因此,现在,在编辑产品时,我在视图中显示制造商名称列表。我选择其中一个制造商,然后请求像往常一样转到产品驱动程序,在那里,我无法将我选择的名称(字符串)分配给ProductPart的制造商(ManufacturerPartRecord)属性。我想使用制造商存储库按我选择的名称查找记录。但是,我不知道如何从ProductDriver.Editor()方法访问该名称。这取决于是自动连接部件还是自己处理。无论采用哪种路径,在显示制造商名称列表时,都应将其Id设置为列表项的值,如果使用自动零件连接,则应将选择列表的名称设置为例如@Html.FieldNameFor(m=>m.ManufacturerPartRecord.Id),或者例如@Html.FieldNameFor(m=>m.ManufacturerPartRecordId)如果您使用的是手动连接。之后,调用updater.TryUpdateModel()后,应该设置id属性。之后,可以创建驱动程序的构造函数,该构造函数接受类型为
    IRepository
    的参数,并将值保存到某个字段(例如:
    private readonly IRepository\u repository;
    )。创建该字段后,可以在更新程序.TryUpdateModel()之后使用存储库,如下所示:
    part.ManufacturerPartRecord=\u repository.Get(part.ManufacturerPartRecordId)这是非常解释性的。我还有一个问题。最后一段是否替换步骤“2”,或者必须以任何方式创建外键。我这样问是因为在我看到的pluralsight的Advanced Orchard课程中,关系是在没有fk的情况下创建的,而不是一个包含两个记录ID的表(对于ref,请参见repo中的UpdateFrom5()),它是可选的。如果创建外键,它将在数据库内部创建,数据库本身将强制执行它,这意味着如果您尝试添加ManufacturerId,它将抛出错误