예제 프로그램을 성공적으로 끝내면 Fluent NHibernate와 함께 Real Work를 시작합니다. 프로젝트 클래스 인 heirarchy에서 Automapping을 사용하려고합니다.Fluent NHibernate로 <float>리스트 또는 float []를 어떻게 automap합니까?
과학적인 계측 응용 프로그램이며, 내가 매핑하는 클래스는 몇 가지 속성이 있습니다.
private float[] _rawY;
public virtual float[] RawY
{
get
{
return _rawY;
}
set
{
_rawY = value;
}
}
이러한 배열은 최대 500 개의 값을 포함 할 수 있습니다.
오토 맵핑이 어레이에서 작동한다고는 예상하지 못했지만 어쨌든 시도해 보니 약간의 성공이 먼저있었습니다. 각 배열은 BLOB (SQLite 사용)으로 자동 매핑 되었기 때문에 가능한 솔루션처럼 보였습니다.
배열을 포함하는 개체에서 SaveOrUpdate를 호출하려고 할 때 첫 번째 문제가 발생했습니다. "float []에 대한 불만족" 예외가 있습니다.
내 생각에 모든 배열을 ILists로 변환하는 것이 었습니다.
public virtual IList<float> RawY { get; set; }
하지만 지금 내가 얻을 : 자동 매핑은 복잡한 객체의 목록을 처리 할 수 있기 때문에, 그것은 나에게 발생하지
NHibernate.MappingException: Association references unmapped class: System.Single
은 기본 유형의 목록을 매핑 할 수 없습니다. 그러나 솔루션에 대한 인터넷 검색을 한 후에 이것이 맞는 것 같습니다. 어떤 사람들은 문제를 해결 한 것 같지만 샘플 코드 I 톱은 현재 가지고있는 것보다 NHibernate에 대한 지식이 더 필요합니다. - 은 그것을 이해하지 못했습니다.
질문 :
1. 어떻게 자동 매핑이 일을 할 수?
2. 또한이 응용 프로그램에 대해 배열이나 목록을 사용하는 것이 더 좋습니까?
(필자는 목록을 선호하지만) 필요에 따라 앱을 수정할 수 있습니다.
편집 :
내가 Mapping Collection of Strings의 코드를 공부 한, 나는 테스트 코드 문자열의 IList의, 예를 설정하는 소스가 참조
public virtual IList<string> ListOfSimpleChildren { get; set; }
[Test]
public void CanSetAsElement()
{
new MappingTester<OneToManyTarget>()
.ForMapping(m => m.HasMany(x => x.ListOfSimpleChildren).Element("columnName"))
.Element("class/bag/element").Exists();
}
은 그래서 이것은 순수한 자동 매핑을 사용 가능해야한다,하지만 난 수동으로 NHibernate에와 매핑 필요한 knowlege이없는 아마 때문에, 작업 제로 운이 점점 아무것도 했어.
내가 해킹해야 할 것 같아서 (누군가가 말할 수없는 한, 플로트 배열을 단일 문자열로 인코딩하거나, 단일 플로트가 포함 된 클래스를 만들어 목록에 집계해야 함) 나에게 그것을 올바르게하는 방법.
최종 편집
이이 응답을 공식화 도움이된다면 여기 내 CreateSessionFactory 방법,의 ...
private static ISessionFactory CreateSessionFactory()
{
ISessionFactory sessionFactory = null;
const string autoMapExportDir = "AutoMapExport";
if(!Directory.Exists(autoMapExportDir))
Directory.CreateDirectory(autoMapExportDir);
try
{
var autoPersistenceModel =
AutoMap.AssemblyOf<DlsAppOverlordExportRunData>()
.Where(t => t.Namespace == "DlsAppAutomapped")
.Conventions.Add(DefaultCascade.All())
;
sessionFactory = Fluently.Configure()
.Database(SQLiteConfiguration.Standard
.UsingFile(DbFile)
.ShowSql()
)
.Mappings(m => m.AutoMappings.Add(autoPersistenceModel)
.ExportTo(autoMapExportDir)
)
.ExposeConfiguration(BuildSchema)
.BuildSessionFactory()
;
}
catch (Exception e)
{
Debug.WriteLine(e);
}
return sessionFactory;
}
@Josh - 빠른 응답에 감사드립니다. 나는 당신이 어디로 가고 있는지보기는하지만, 실제로 실험을하기에 충분하지는 않습니다. 작은 코드 조각으로 응답자를 편집 할 수 있습니까? "나는 일대 다 많은 관계를 수행 할 것입니다 ..."에 대해 자세히 설명해 주시겠습니까? 또한 필자는 순수한 자동 매핑을 수행하고 있음에 유의하십시오. 명시 적 엔티티 매핑 클래스가 없습니다 (단, 문제를 해결할 수있는 유일한 방법 인 경우이를 추가 할 수 있다고 가정합니다). –
IList의 속성에 사용할 수있는 재정의 예제가 추가되었습니다. 시도해보십시오. –
joshperry
@Josh - 내 개체 모델에서 모든 IList properties에 대한 재정의를 시도했지만 여전히 "... 매핑되지 않은 클래스 : System.Single"예외가 발생합니다. –