Тест Спецификации сохраняемости Fluent-Nhibernate, генерирующий ошибку внешнего ключа SQLite - PullRequest
0 голосов
/ 14 февраля 2012

Я думал, что это будет сравнительно простой тест по картированию / персистентности, но, ударившись головой об эту проблему, я решил обратиться к экспертам.

При выполнении теста на устойчивость ниже я сталкиваюсь с этой ошибкой:

NHibernate.Exceptions.GenericADOException: не удалось вставить: System.Data.SQLite.SQLiteException: ошибка SQLite несоответствие внешнего ключа

При просмотре сгенерированных таблиц sqllite из теста выясняется, что существует дублированный внешний ключ. Не знаете, как решить эту проблему, если это действительно то, что я делаю неправильно.

Сущности

public class Area
{
    public virtual int AreaID { get; set; }
    public virtual string AreaCode { get; set; }
    public virtual string AreaDescription { get; set; }

    public virtual IList<Location> Locations { get; set; }
}

public class Location {
    public virtual int AreaID { get; set; }
    public virtual string CityName { get; set; }
    public virtual string AreaName { get; set; }
    public virtual Area Area { get; set; }
}

Отображения :

    public AreaMap()
    {
        Table("Area");
        LazyLoad();
        Id(x => x.AreaID).GeneratedBy.Identity().Column("AreaID");
        Map(x => x.AreaCode).Column("AreaCode").Not.Nullable().Length(2);
        Map(x => x.AreaDescription).Column("AreaDescription").Not.Nullable().Length(50);
        HasMany(x => x.Locations)
            .KeyColumn("AreaCode")
            .Inverse()
            .Cascade.None();
    }

public LocationMap()
{
    Table("Locations");
    LazyLoad();
    Id(x => x.AreaID).GeneratedBy.Assigned().Column("AreaID");
    Map(x => x.CityName).Column("CityName").Length(255);
    Map(x => x.AreaName).Column("AreaName").Length(255);
    References(x => x.Area)
        .PropertyRef(x => x.AreaCode)
        .Column("AreaCode")
        .Fetch.Join();
}

Тест :

    new PersistenceSpecification<Location>(Session)
        .CheckProperty(x => x.AreaID, 1)
        .CheckProperty(x => x.CityName, "SomeCity")
        .CheckProperty(x => x.AreaName, "SomeSubArea")
        .CheckReference(x => x.Area, new Area { AreaCode = "S1", AreaDescription = "Some description goes here" })
        .VerifyTheMappings();

Сгенерированные таблицы :

create table Area (
        AreaID  integer primary key autoincrement,
       AreaCode TEXT not null,
       AreaDescription TEXT not null
    )

create table Locations (
    AreaID INT not null,
   CityName TEXT,
   AreaName TEXT,
   AreaCode TEXT,
   primary key (AreaID),
   constraint FK6AF881A49C5CF81 foreign key (AreaCode) references Area,
   constraint FK6AF881A49C5CF81 foreign key (AreaCode) references Area (AreaCode)
)

1 Ответ

1 голос
/ 14 февраля 2012
HasMany(x => x.Locations)
    .PropertyRef(x => x.AreaCode)

Обновление: возможно, эта область не сохранена.Попробуйте с

HasMany(x => x.Locations)
    .Cascade.All()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...