Вы можете использовать именованный блок вокруг петель:
search: {
for (Type type : types) {
for (Type t : types2) {
if (some condition) {
// Do something and break...
break search;
}
}
}
}
Лучший способ сериализовать отображенный объект NH - не сериализовать его :).
Если вы отправляете его по сети, вам действительно следует создать для него DTO. Если вы не хотите создавать этот объект, вы можете установить [XmlIgnore] для свойств, которые не хотите сериализовать.
Если вам нужны все свойства, вы должны загрузить их ВСЕ из базы данных - для некоторых будет достаточно активной загрузки для других (когда слишком много объединений начнут дублировать данные), вам придется обращаться к этому свойству любым способом. вы хотите вызвать загрузку.
Изменить:
И я хотел бы добавить еще одну вещь - отправка ваших доменных объектов по сети всегда плохая идея. В моем случае я усвоил это на собственном горьком опыте - я открываю некоторые сущности через WebService - и теперь почти любые изменения (переименование свойства, удаление свойства .. и т. д.) в мой домен убивает приложение, использующее WS - плюс у целой группы свойств есть [XmlIgnore] (не забывайте о циклических зависимостях).
Мы скоро переписываем - но будьте уверены, что это не то, что я когда-либо сделаю снова. :)
Edit 2
Вы можете использовать AutoMapper для передачи данных от вашего объекта в DTO. У них есть несколько примеров на сайте.
Согласитесь с sirrocco, у меня было ужасное время, пытаясь сериализовать сущности NHibernate через WCF, и в конечном итоге я выбрал решение DTO, реализованное в общем через отражение.
Изменить: все решение слишком велико, чтобы публиковать здесь, и, конечно же, настроено для моих нужд, поэтому я опубликую несколько соответствующих разделов:
[DataContract]
public class DataTransferObject
{
private Dictionary<string, object> propertyValues = new Dictionary<string, object>();
private Dictionary<string, object> fieldValues = new Dictionary<string, object>();
private Dictionary<string, object> relatedEntitiesValues = new Dictionary<string, object>();
private Dictionary<string, object> primaryKey = new Dictionary<string, object>();
private Dictionary<string,List<DataTransferObject>> subEntities = new Dictionary<string, List<DataTransferObject>>();
...
public static DataTransferObject ConvertEntityToDTO(object entity,Type transferType)
{
DataTransferObject dto = new DataTransferObject();
string[] typePieces = transferType.AssemblyQualifiedName.Split(',');
dto.AssemblyName = typePieces[1];
dto.TransferType = typePieces[0];
CollectPrimaryKeyOnDTO(dto, entity);
CollectPropertiesOnDTO(dto, entity);
CollectFieldsOnDTO(dto, entity);
CollectSubEntitiesOnDTO(dto, entity);
CollectRelatedEntitiesOnDTO(dto, entity);
return dto;
}
....
private static void CollectPropertiesOnDTO(DataTransferObject dto, object entity)
{
List<PropertyInfo> transferProperties = ReflectionHelper.GetProperties(entity,typeof(PropertyAttribute));
CollectPropertiesBasedOnFields(entity, transferProperties);
foreach (PropertyInfo property in transferProperties)
{
object propertyValue = ReflectionHelper.GetPropertyValue(entity, property.Name);
dto.PropertyValues.Add(property.Name, propertyValue);
}
}
тогда, когда вы захотите воскресить DTO:
private static DTOConversionResults ConvertDTOToEntity(DataTransferObject transferObject,object parent)
{
DTOConversionResults conversionResults = new DTOConversionResults();
object baseEntity = null;
ObjectHandle entity = Activator.CreateInstance(transferObject.AssemblyName,
transferObject.TransferType);
if (entity != null)
{
baseEntity = entity.Unwrap();
conversionResults.Add(UpdatePrimaryKeyValue(transferObject, baseEntity));
conversionResults.Add(UpdateFieldValues(transferObject, baseEntity));
conversionResults.Add(UpdatePropertyValues(transferObject, baseEntity));
conversionResults.Add(UpdateSubEntitiesValues(transferObject, baseEntity));
conversionResults.Add(UpdateRelatedEntitiesValues(transferObject, baseEntity,parent));
....
private static DTOConversionResult UpdatePropertyValues(DataTransferObject transferObject, object entity)
{
DTOConversionResult conversionResult = new DTOConversionResult();
foreach (KeyValuePair<string, object> values in transferObject.PropertyValues)
{
try
{
ReflectionHelper.SetPropertyValue(entity, values.Key, values.Value);
}
catch (Exception ex)
{
string failureReason = "Failed to set property " + values.Key + " value " + values.Value;
conversionResult.Failed = true;
conversionResult.FailureReason = failureReason;
Logger.LogError(failureReason);
Logger.LogError(ExceptionLogger.BuildExceptionLog(ex));
}
}
return conversionResult;
}