Как сопоставить наследование таблиц в устаревшей базе данных? - PullRequest
1 голос
/ 01 октября 2011

Мне очень сложно сопоставить устаревшую базу данных.

Вот сценарий: подрядчик подает заявку на новую лицензию.Лицензия запрашивается и отображается.Подрядчик изменяет любую информацию, которую необходимо изменить.И по завершении приложение сохраняется в базе данных.

Лицензия принадлежит либо предприятию, либо владельцу, это лицензия любой полиморфной ассоциации.Сама Лицензия содержит TableID и RecordID, которые используются для установления ассоциации.

Лицензии имеют много Приложений.В этой системе есть несколько типов приложений, поэтому есть таблица «ApplicationCommon» и таблица «LicenseApplication».Это конкретное приложение для лицензии.ApplicationCommon и The LicenseApplication используют один и тот же первичный ключ.Другими словами, идентификатор ApplicationCommon совпадает с идентификатором LicenseApplication.Так что это наследование таблиц (или я так думаю).

Из-за странной полиморфной связи с бизнесом мне приходится запрашивать бизнес-данные отдельно от лицензии (или я так думаю, что-то новое дляNHibernate).Когда у меня есть лицензия и бизнес, я пытаюсь создать новое приложение, то есть когда происходит сбой системы.

Вот исключение, которое я получаю:

 "object references an unsaved transient instance - save the transient instance 
 before flushing. Type: LicenseApplication, Entity: LicenseApplication"

Вот сопоставления:

    public LicenseApplicationMap()
    {
        Table("Applications_LicenseApplication");
        Id(x => x.ID).Column("intApplicationID").Not.Nullable();
        Map(x => x.TableID).Column("intTableID").Nullable();
        Map(x => x.RecordID).Column("intRecordID").Nullable();
        References(x => x.Type).Column("intLicenseTypeID").Not.Nullable();

        Map(x => x.InsuranceExpiresOn).Column("dtInsuranceExpiresOn");
        Map(x => x.WCInsuranceExpiresOn).Column("dtWCInsuranceExpiresOn");
        Map(x => x.Updated).Column("dtUpdated");
        Map(x => x.AuthorizedRepresentativeFirstName).Column("strAuthRepFirstName");
        Map(x => x.AuthorizedRepresentativeLastName).Column("strAuthRepLastName");
        Map(x => x.AuthorizedRepresentativeGreeting).Column("strAuthRepGreeting");

        HasOne(x => x.ApplicationCommon).ForeignKey("intApplicationID").Cascade.All();
        References(x => x.License).Column("intLicenseID");

        HasMany(x => x.Officers).KeyColumn("intApplicationID");
        HasMany(x => x.Designees).KeyColumn("intApplicationID");
    }

.

    public LicenseCommonMap()
    {
        Table("Licensing_LicenseCommon");
        Id(x => x.ID).Column("intLicenseID").Not.Nullable();
        Map(x => x.TableID).Column("intTableID").Nullable();
        Map(x => x.RecordID).Column("intRecordID").Nullable();
        Map(x => x.LicenseNumber).Column("strNumber");
        References(x => x.Type).Column("intLicenseTypeID").Not.Nullable();
        References(x => x.Status).Column("intLicenseStatusID").Not.Nullable();
        Map(x => x.StartsOn).Column("dtStartsOn");
        Map(x => x.EndsOn).Column("dtEndsOn");
        Map(x => x.CreatedOn).Column("dtCreatedOn");
        Map(x => x.RenewedOn).Column("dtRenewedOn");
        Map(x => x.InsuranceExpiresOn).Column("dtInsuranceExpiresOn");
        Map(x => x.WorkmansCompensationExpiresOn).Column("dtWCInsuranceExpiresOn");
        Map(x => x.LastUpdated).Column("dtLastUpdated");
        HasMany(x => x.Applications).KeyColumn("intLicenseID");
    }

.

    public ApplicationCommonMap()
    {
        Table("Applications_ApplicationCommon");
        Id(x => x.ID).Column("intApplicationID");
        References(x => x.Type).Column("intApplicationTypeID");
        References(x => x.Status).Column("intApplicationStatusID");
        References(x => x.LicenseApplication).Column("intApplicationID").Cascade.All();
    }

.

    public BusinessMap()
    {
        Table("Core_Business");
        Id(x => x.ID).Column("intBusinessID").GeneratedBy.Identity();

        Map(x => x.BusinessName).Column("strBusinessName").Not.Nullable();
        Map(x => x.PhoneNumber).Column("strPhoneNumber").Not.Nullable();
        Map(x => x.FaxNumber).Column("strFaxNumber").Not.Nullable();
        Map(x => x.EmailAddress).Column("strEmailAddress").Not.Nullable();
        Map(x => x.YearOrganized).Column("strYearOrganized").Not.Nullable();
        Map(x => x.LastUpdated).Column("dtLastUpdated").Not.Nullable();

        Map(x => x.PhysicalAddr1).Column("strPhysicalAddr1").Not.Nullable();
        Map(x => x.PhysicalAddr2).Column("strPhysicalAddr2").Nullable();
        Map(x => x.PhysicalCity).Column("strPhysicalCity").Not.Nullable();
        Map(x => x.PhysicalState).Column("strPhysicalState").Not.Nullable();
        Map(x => x.PhysicalCountry).Column("strPhysicalCountry").Not.Nullable();

        Map(x => x.PhysicalZip).Column("strPhysicalZip").Not.Nullable();

        Map(x => x.MailingAddr1).Column("strMailingAddr1").Not.Nullable();
        Map(x => x.MailingAddr2).Column("strMailingAddr2").Nullable();
        Map(x => x.MailingCity).Column("strMailingCity").Not.Nullable();
        Map(x => x.MailingState).Column("strMailingState").Not.Nullable();
        Map(x => x.MailingCountry).Column("strMailingCountry").Not.Nullable();

        Map(x => x.MailingZip).Column("strMailingZip").Not.Nullable();
    }

И, наконец, я использую .Net MVC,AutoMapper и S # rpArch, так вот мое действие контроллера и мой запрос.SaveLicense и SaveQuery выполняют ту же логику, SaveOrUpdate, затем Flush.

    [HttpPost]
    [Transaction]
    public ActionResult Edit(int id, LicenseViewModel applicationData)
    {
        // 1. Get the current license.
        var license = _licenseService.GetLicenseCommon(id);

        // 2. Make changes to license that where made during application process
        Mapper.Map<LicenseViewModel , LicenseCommon>(applicationData, license);
        var business = _licenseService.GetBusiness(license.RecordID);
        Mapper.Map<LicenseViewModel , Business>(applicationData, business);
        business.LastUpdated = DateTime.Now;

        // 3. Create a new application and add it to the license
        var application = new LicenseApplication();
        Mapper.Map<LicenseViewModel , LicenseApplication>(applicationData, application);
        application.Updated = DateTime.Now;
        application.InsuranceExpiresOn = DateTime.Parse(applicationData.GeneralLiabilityExpiration);
        application.WCInsuranceExpiresOn = DateTime.Parse(applicationData.WorkmansCompensationExpiration);
        application.TableID = 33;
        application.RecordID = license.RecordID;


        // 4. Save the license and it's applications to the database.
        license.Business = business;  //Don't think this works at all...
        license.Applications.Add(application);
        application.License = license;
        ///////////////// BOOM THIS IS WHERE IT BLOWS UP //////////////////////
        _licenseService.SaveLicense(license);
        _businessService.SaveBusiness(business);

        // 5. Convert the modified license and it's newly created application to an LicenseViewModel
        Mapper.Map<LicenseCommon, LicenseViewModel >(license, applicationData);

        // 6. return json or error message
        return Json(applicationData);
    }

Скажите, пожалуйста, что не так с моими сопоставлениями.

1 Ответ

0 голосов
/ 04 октября 2011

HasMany(x => x.Applications).KeyColumn("intLicenseID"); отсутствует .Cascade.All(), поэтому при сохранении лицензии также сохраняются изменения в приложениях.

И .Inverse было бы также неплохо сказать NH, что Application отвечает за ассоциацию.

А также

// class LicenseCommon
public void Add(LicenseApplication application)
{
    application.License = license;
    application.TableID = 33;
    application.RecordID = license.RecordID;
    Applications.Add(application);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...