我已经解决了这个问题,但我正在试图找出它的工作原理.基本上,我使用foreach循环遍历结构列表.如果我在调用struct的方法之前包含引用当前结构的LINQ语句,则该方法无法修改结构的成员.无论是否甚至调用LINQ语句,都会发生这种情况.我能够通过将我正在寻找的值分配给变量并在LINQ中使用它来解决这个问题,但我想知道是什么导致了这一点.这是我创建的一个例子.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WeirdnessExample
{
public struct RawData
{
private int id;
public int ID
{
get{ return id;}
set { id = value; }
}
public void AssignID(int newID)
{
id = newID;
}
}
public class ProcessedData
{
public int ID { get; set; }
}
class Program
{
static void Main(string[] args)
{
List<ProcessedData> processedRecords = new List<ProcessedData>();
processedRecords.Add(new ProcessedData()
{
ID = 1
});
List<RawData> rawRecords = new List<RawData>(); …Run Code Online (Sandbox Code Playgroud) 我正在尝试保存一个复杂的对象,里面有许多引用的元素,它在大多数时候都能正常工作.
但是在某些情况下我们得到以下例外,
object引用未保存的瞬态实例 - 在刷新之前保存瞬态实例,或者将属性的级联操作设置为使其自动保存的内容.类型:Namespace.Core.Client.ClientDetails,Entity:Namespace.Core.Client.ClientDetails
问题是,我的复杂对象中有大约12个ClientDetails元素,我们正试图保存.有没有办法识别哪个对象实例导致了这个问题?通过NHibernate日志记录或其他方式?我的代码示例用于保存如下,
_repository.Save<SuperParent>(obj);
_repository.Flush();
Run Code Online (Sandbox Code Playgroud)
请注意,当我将Nhibernate show_sql设置为true时,我能够看到正确生成的所有查询,但是当调用flush时,抛出异常.
请帮助解决问题.
我刚刚阅读了有关Entity Framework 4(实际上是版本2)的这篇文章.
实体框架似乎比其首次发布提供了巨大的改进.因此,我从来没有在任何项目中使用EF,因为我觉得EF与NHibernate相比还不够成熟.
NHibernate及其目前对FluentNHibernate和Linq for NHibernate的贡献由Ayende Rahien提供
我的感觉是,当NHibernate的第二版出现时,微软只是试图获得有利于NHibernate的地形.不过,我的担忧是以下(不是特别有序):
NHibernate是一个很棒的工具,我想每个人都同意.由于其前身Hibernate,我们可以轻松找到文档和教程以及示例应用程序以熟悉它.FluentNHibernate不是这种情况.特别是根据我正在进行的项目,我要求我进一步调查NHibernate及其选项(例如FluentNHibernate),以便记录NHibernate和FluentNHibernate技术的使用规则和最佳实践.因此,作为一名C风格的开发人员被VB34戴上手铐,我无法在VB.NET中找到所提供示例的语法等效,尽管我已经到目前为止.
我相信NHibernate是最好的选择,但作为一名软件顾问,我不能(不想)错过重要的技术变革,改进和发展.
尽管我读到了关于EF1的不好评论,但EF4看起来非常有前景.您对NHibernate和Entity Framework途径的看法是什么?至于我,我对所有的阅读都感到困惑.我需要你把头伸出水面.
谢谢大家!
我有一个包含10个数据对象的列表,我希望使用NHibernate插入/更新到数据库.如果一个抛出异常(比如一个主键违规),我想仍然插入/更新另一个9.我将每个对象操作转换为它自己的原子事务,并在有异常时回滚事务.问题是如果事务确实导致异常并被回滚,那么在下一个事务中,Nhibernate会在Nexus.Data.PortfolioCorporateEntity条目中抱错:null id (在发生异常后不要刷新会话)
我的主要计划很简单.它从sessionfactory创建会话,创建数据访问层,对数据对象执行一些操作,然后尝试将这些数据对象持久保存到数据库.
sessionsManager = new NHibernateSessionManager();
session = sessionsManager.GetSession();
DALC = new NHibernateDataProvider(session);
…
foreach (var pce in pces)
{
try
{
DALC.UpdateOrAddObject<PortfolioCorporateEntity>(pce);
}
catch (Exception ex)
{
Console.WriteLine("Could not add Corporate Entity ID " + pce.CorporateEntity.CorporateEntityID.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的Nhibernate数据访问层中的updateOrAdd过程,对10个对象称为10次.
public void UpdateOrAddObject<T>(T workObject)
{
using (ITransaction tx = mSession.BeginTransaction) {
try {
mSession.SaveOrUpdate(workObject);
mSession.Flush();
tx.Commit();
}
catch (Exception ex) {
tx.Rollback();
throw;
}
}
}
Run Code Online (Sandbox Code Playgroud)
为了清楚说明,会话由调用程序实例化并传递给数据访问层对象,其构造函数如下所示.
public NHibernateDataProvider(ISession session)
{
mSession = session;
}
Run Code Online (Sandbox Code Playgroud)
除了异常之外,它工作正常,它表示不会在异常后刷新会话.我不确定为什么 - 事务很好地回滚,数据库应该准备接受另一个事务没有?我究竟做错了什么?
我在NHibernate 3.2和SQLite提供程序中有这个简单的linq查询:
var all = (from book in Session.Query<Book>() select book)
.Skip(15)
.Take(15)
.ToList();
Run Code Online (Sandbox Code Playgroud)
这个查询正确地返回了15个实体,但是当我尝试用FetchMany急切加载依赖集合时,如下所示:
var all = (from book in Session.Query<Book>() select book)
.FetchMany(books => books.Authors)
.Skip(15)
.Take(15)
.ToList();
Run Code Online (Sandbox Code Playgroud)
我只返回了11个实体.这是一个我错过的错误吗?
这是生成的SQL查询
select
book0_.Id as Id2_0_,
author2_.Id as Id0_1_,
book0_.Title as Title2_0_,
book0_.Sort as Sort2_0_,
book0_.TimeStamp as TimeStamp2_0_,
book0_.PubDate as PubDate2_0_,
book0_.Series_Index as Series6_2_0_,
book0_.Author_Sort as Author7_2_0_,
book0_.Isbn as Isbn2_0_,
book0_.Lccn as Lccn2_0_,
book0_.Path as Path2_0_,
book0_.Flags as Flags2_0_,
book0_.Uuid as Uuid2_0_,
book0_.Has_Cover as Has13_2_0_,
book0_.Last_Modified as Last14_2_0_,
author2_.Name as …Run Code Online (Sandbox Code Playgroud) 我们使用ClosedXML将数据表对象转换为Excel电子表格,以便呈现给用户.只需将所有数据库值(来自NHibernate)分配给字符串然后按如下方式格式化它们即可构建DataTable对象:
//formatting
EstimatedCost = Currency.SafeToString(Currency.Create(n.EstimatedCost)),
Run Code Online (Sandbox Code Playgroud)
然后,我们将列类型设置为属性类型,即在所有情况下都为String.
在输出Excel工作表中会发生什么,因为该列设置为货币但具有数字作为文本警告,然后它将无法正确排序.
我的问题是,因为我们将所有数据构建到DataTable中,所以我没有机会正确地装饰ClosedXML列.有没有一种快速的方法可以做到这一点,我没想到?
public const string ExcelDataType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml";
public static MemoryStream GenerateExcelFileFromData(IEnumerable<KeyValuePair<string, DataTable>> tabs, int colWidth = 100)
{
var workbook = new XLWorkbook { ColumnWidth = colWidth };
foreach (var enumerable in tabs)
{
workbook.Worksheets.Add(enumerable.Value, enumerable.Key);
}
Run Code Online (Sandbox Code Playgroud)
...
public static DataTable ConvertToDataTable<T>(IEnumerable<T> varlist, List<string> excludedColumns, bool titleizeColumn = false)
{
var dtReturn = new DataTable();
// column names
PropertyInfo[] oProps = null;
if (varlist == null) return dtReturn;
foreach (T rec in varlist) …Run Code Online (Sandbox Code Playgroud) 我有几个项目使用NH和FNH生成映射(一些Fluent一些Automapped).我仍然需要一些bug和缺少的功能,但似乎FNH可能因为集成到NHibernate中的代码映射而死亡.
问题:有助于FNH或将映射迁移到代码映射或confORM并修复问题/实现功能吗?
nhibernate nhibernate-mapping fluent-nhibernate nhibernate-mapping-by-code fluent-nhibernate-mapping
我使用Applicationdomain动态加载一个DLL,以便在nessesary时卸载.如果加载的dll中的任务终止,那么我无法工作的是来自创建的Appdomain的回调方法.
到目前为止我有什么
public interface IBootStrapper
{
void AsyncStart();
void StopAndWaitForCompletion();
event EventHandler TerminatedItself;
}
Run Code Online (Sandbox Code Playgroud)
和"初学者"方面
private static Procedure CreateDomainAndStartExecuting()
{
AppDomain domain = AppDomain.CreateDomain("foo", null, CODEPATH, string.Empty, true);
IBootStrapper strapper = (IBootStrapper)domain.CreateInstanceAndUnwrap(DYNAMIC_ASSEMBLY_NAME, CLASSNAME);
strapper.ClosedItself += OnClosedItself;
strapper.AsyncStart();
return delegate
{
strapper.StopAndWaitForCompletion();
AppDomain.Unload(domain);
};
}
Run Code Online (Sandbox Code Playgroud)
这导致程序集未找到异常,因为OnClosedItself()是一个只有Starter知道的类型的方法,它在appdomain中不存在.
如果我将OnClosedItself作为委托包装在一个可序列化的类中,它就是一样的.
有什么建议?
编辑:我正在尝试做的是建立一个自我更新的任务.因此我创建了一个启动器,如果有新版本可以停止并重新创建任务.但是如果任务从其他地方停止,它也应该通知启动器终止.
//从问题中删除了大量临时代码
编辑2:哈普洛指出我正确的方向.我能够用信号量实现回调.
我正在尝试实现datagridview的虚拟模式,但是当我将RowCount设置为某个数字(以显示滚动条)时,网格希望一次拥有所有行,而不仅仅是显示行。
DataGridView grid = new ...;
grid.VirtualMode = true;
grid.CellValueNeeded += OnCellValueNeeded;
grid.RowCount = dataprovider.GetFullCount();
Run Code Online (Sandbox Code Playgroud)
如何告诉网格仅请求显示的行?
我从Windows 7(32位)切换到Windows 7(64位),因为我为2 GB添加了4 Gb RAM.现在,当我跑步的时候Eclipse Juno EE.在Windows任务管理器中,我看到该进程javaw.exe正在吃~380 Mb RAM,我之前没有看到过这种情况,当时我使用的是32位操作系统.我甚至没有尝试过任何项目的午餐.我写了这段代码:
public static void main(String[] args) {
Runtime runtime = Runtime.getRuntime();
System.out.println(runtime.maxMemory());
}
Run Code Online (Sandbox Code Playgroud)
它表明,对我来说JVM is allocated 1 338 507 264 bytes.
这意味着当我运行项目时,这个过程可能消耗高达1.3 Gb Ram?
将来我有什么问题吗?
我试图在很长一段时间内弄清楚这个问题.我有一个hacky方式来使它工作.
我只想知道在Fluent NHibernate映射中是否可行.
假设我有两个表例如:
Table ComissionLevel
{
Year,
ComissionLevelID,
... other properties ....
}
primary key (Year,ComissionLevelID)
Table ClientCommission
{
Year,
ClientID,
CommissionLevelID_1,
CommissionLevelID_2,
... other properties ...
}
primary key (Year,ClientID)
foreign key CommissionLevel1 (Year,CommissionLevelID_1)
foreign key CommissionLevel2 (Year,CommissionLevelID_2)
Run Code Online (Sandbox Code Playgroud)
目前我的映射如下:
public ComissionLevelMap()
{
Schema("XXXX");
Table("ComissionLevel");
LazyLoad();
CompositeId()
.KeyProperty(x => x.Year, set => {
set.ColumnName("Year");
set.Access.Property(); } )
.KeyProperty(x => x.CommissionLevelID, set => {
set.ColumnName("CommissionLevelID");
set.Length(10);
set.Access.Property(); } );
HasMany<ClientCommission>(x => x.ClientCommissions)
.Access.Property()
.AsSet()
.Cascade.AllDeleteOrphan()
.LazyLoad()
.Inverse()
.Generic()
.KeyColumns.Add("Year", mapping …Run Code Online (Sandbox Code Playgroud) 我想在流畅的nHibernate中使用以下查询:
_dataContext.Products
.Where(filterExpression)
.OrderBy(sortExpression + " " + sortDirection)
.Skip(pageIndex * pageSize)
.Take(pageSize);
Run Code Online (Sandbox Code Playgroud) 我的目标是实现删除所有建议,然后插入新建议.(任何在线示例都会有很大帮助.
hbm映射如下:
<set name="recommendations" table="PRD_PRODUCT_RECOMMENDATION"
inverse="true" lazy="true" batch-size="25" fetch="select" cascade="save-update, delete">
<cache usage="nonstrict-read-write"/>
<key column="productguid" not-null="true"/>
<one-to-many class="com.quinstreet.persistence.productCatalogue.ProductRecommendationDBVO" />
</set>
Run Code Online (Sandbox Code Playgroud)
我使用以下代码删除建议:
ProductDBVO dbvo =((ProductImpl)product).getProductDBVO();
Set<ProductRecommendationDBVO> recommendations= dbvo.getRecommendations();
dbvo.getRecommendations().remove(recommendations);
getHibernateTemplate().saveOrUpdate(recommendations);
getSession().flush();
getSession().refresh(((ProductImpl)product).getProductDBVO());
Run Code Online (Sandbox Code Playgroud)
并得到错误:
org.springframework.orm.hibernate3.HibernateSystemException: Unknown entity: org.hibernate.collection.PersistentSet; nested exception is org.hibernate.MappingException: Unknown entity: org.hibernate.collection.PersistentSet
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:659)
at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:378)
at org.springframework.orm.hibernate3.HibernateTemplate.delete(HibernateTemplate.java:791)
at org.springframework.orm.hibernate3.HibernateTemplate.delete(HibernateTemplate.java:787)
at com.quinstreet.persistence.product.ProductDAOHibImpl.deleteRecommendations(ProductDAOHibImpl.java:2564)
at com.quinstreet.service.product.ProductServiceImpl.updateCatalogue(ProductServiceImpl.java:1827)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:301)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at $Proxy36.updateCatalogue(Unknown …Run Code Online (Sandbox Code Playgroud)