Я строю прямой порт поставщика членства ASP.NET от SQL до Sharp Arch 1.9.6 (используя Fluent NHibernate). Проблема возникает при попытке создать взаимно-однозначное отношение между aspnet_Users и таблицей aspnet_Membership. Вот что у меня есть:
public class User : EntityWithTypeId<Guid>
{
public virtual Membership Membership { get; set; }
}
public class Membership : EntityWithTypeId<Guid>
{
public virtual User User { get; set; }
}
public class UserMap : IAutoMappingOverride<User>
{
public void Override(AutoMapping<User> mapping)
{
mapping.Table("aspnet_Users");
mapping.HasOne(x => x.Membership)
.PropertyRef(r => r.User)
.Cascade.All();
}
}
public class MembershipMap : IAutoMappingOverride<Membership>
{
public void Override(AutoMapping<Membership> mapping)
{
mapping.Table("aspnet_Membership");
mapping.Id(x => x.Id)
.Column("UserId")
.GeneratedBy.Foreign("User");
mapping.HasOne(x => x.User)
.ForeignKey("Membership_User_FK_Manual")
.Constrained();
}
}
Все остальные свойства настроены, но для того, чтобы пост был как можно более коротким, я перечислил только необходимую информацию.
Модульный тест от Sharp Arch, который генерирует схему БД, делает это правильно, показывая взаимно-однозначное соответствие между таблицами.
Проблема в том, что когда я иду, чтобы получить пользователя из базы данных, используя репозиторий, который предоставляет Sharp Arch. Я получаю ошибку:
NHibernate.PropertyAccessException : Invalid Cast (check your mapping for property type mismatches); setter of TrackerI9.Core.Providers.Entities.Membership
----> System.InvalidCastException : Specified cast is not valid.
Я использую SQLite в качестве базы данных для тестирования, и из операторов INSERT, которые выводят данные на консоль тестирования, я убедился, что данные вставляются в базу данных правильно и используют соответствующие идентификаторы. При необходимости я могу включить их и трассировку стека.
Я работаю над этим уже неделю и не нашла никакого решения. Я всегда мог объединить две таблицы в одну и просто двигаться дальше, но, как я уже сказал выше, я бы предпочел использовать порт DIRECT.
Дайте мне знать, что вы думаете.