我正在使用Fluent-NHibernate(使用自动化)来生成我的表,但是想要选择与默认使用的ID字段不同的聚簇索引.如何在默认主键字段以外的字段上使用Fluent NHibernate创建聚簇索引?
这背后的主要原因很简单.我正在使用Guids作为我的主键字段.默认情况下,NHibernate在主键字段上创建聚簇索引.由于Guids通常不是顺序的,因此主键字段上的群集会导致性能问题.
众所周知,在表格末尾附加记录比在表格中插入记录要便宜得多.此外,表中的记录按聚集索引中的项目顺序物理存储.由于Guids有点"随机"而且不是顺序的,因此可能会生成小Guid,这些Guid小于表中已有的其他Id Guids的值 - 导致表插入而不是追加.
为了最小化这个,我有一个名为CreatedOn的列,其类型为DateTime.我需要将表聚集在此CreatedOn列上,以便附加所有新记录而不是插入.
欢迎任何有关如何实现这一目标的想法!
注意:我意识到我可以使用顺序指南,但出于安全原因,我不想走这条路.
注意:我仍然没有这篇文章的答案,但我现在有一些想法,我正在思考.
使用NHibernate而不使用Fluent,我认为可以直接在NHibernate中创建聚簇索引.我还不太了解NHibernate知道如何做到这一点.我很漂亮(几乎绝对是)确定它可以完成.
Fluent-NHibernate过去常常包含一种在最近重写之前在SQL对象上设置属性(例如像聚簇索引)的方法.现在这个选项似乎已经消失了.我可能会在某处发布一个问题,看看该选项是否仍然可用.如果是这样,我可能会使用它来设置聚集索引.
Fluent-NHibernate能够在流畅构建后公开配置以进行手动编辑.我没有尝试过这个功能,但希望它可以提供设置聚簇索引所需的粒度级别.
在最糟糕的情况下,我可以编写一个SQL脚本来在生成所有表后更改聚簇索引.但是,我对这种方法有几个问题.答:由于我使用自动模式生成,NHibernate会在下次评估配置时"撤消"我的聚簇索引吗?2.如果检测到聚簇索引已更改,NHibernate会出错吗?我需要测试一下,但还没有这样做.我真的很讨厌这个解决方案.我正在测试我的数据库对SQLServer2008和MySQL.NHibernate的一部分优点是它与数据库无关.一旦我们介绍了脚本,所有的赌注都会被取消.
在一个名为IPropertyInstance Classes的流畅约定中使用了一个接口,该接口从此接口继承了一个Index属性,该属性允许在该字段上创建索引.问题是没有标志或其他选项允许将索引创建为群集.最简单的解决方案是向此方法添加属性以允许创建聚簇索引.我想我可以向Fluent-NHibernate开发人员提出建议.
My Entity Class:
public class Building
{
/// <summary>
/// internal Id
/// </summary>
public virtual long Id { get; set; }
..............
}
Run Code Online (Sandbox Code Playgroud)
我的映射:
var model = AutoMap.AssemblyOf<Building>()
.Setup(s => s.FindIdentity = p => p.Name == "Id")
.Where(t => t.Namespace == "SpikeAutoMappings");
var database = Fluently.Configure()
.Database(DatabaseConfigurer)
.Mappings(m=>m.AutoMappings.Add(model));
Run Code Online (Sandbox Code Playgroud)
我需要有人帮我看看有什么问题因为我在运行单元测试时一直有这个错误:
Initialization method TestProject1.MappingTestBase.TestInitialize threw exception. FluentNHibernate.Cfg.FluentConfigurationException: FluentNHibernate.Cfg.FluentConfigurationException: An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.
---> FluentNHibernate.Visitors.ValidationException: The entity …Run Code Online (Sandbox Code Playgroud) 我是整个城堡Windsor,Nhibernate,Fluent和Automapping堆栈的新手,所以请原谅我的无知.我不想在此发布另一个问题,因为似乎已经有大量问题试图解决Windsor nhib Isession管理问题,但到目前为止他们都没有解决我的问题.当我试图从我的存储库调用Db时,我仍然得到一个ISession已关闭的异常,这是我的容器设置代码.
container.AddFacility<FactorySupportFacility>()
.Register(
Component.For<ISessionFactory>()
.LifeStyle.Singleton
.UsingFactoryMethod(() => Fluently.Configure()
.Database(
MsSqlConfiguration.MsSql2005.
ConnectionString(
c => c.Database("DbSchema").Server("Server").Username("UserName").Password("password")))
.Mappings
(
m =>
m.AutoMappings.Add
(
AutoMap.AssemblyOf<Message>(cfg)
.Override<Client>(map =>
{
map.HasManyToMany(x => x.SICCodes).Table("SICRefDataToClient");
})
.IgnoreBase<BaseEntity>()
.Conventions.Add(DefaultCascade.SaveUpdate())
.Conventions.Add(new StringColumnLengthConvention(),new EnumConvention())
.Conventions.Add(new EnumConvention())
.Conventions.Add(DefaultLazy.Never())
)
)
.ExposeConfiguration(ConfigureValidator)
.ExposeConfiguration(BuildDatabase)
.BuildSessionFactory() as SessionFactoryImpl),
Component.For<ISession>().LifeStyle.PerWebRequest.UsingFactoryMethod(kernel => kernel.Resolve<ISessionFactory>().OpenSession()
));
Run Code Online (Sandbox Code Playgroud)
在我的存储库中,我注入private readonly ISession session;并使用它作为followes
public User GetUser(int id)
{
User u;
u = session.Get<User>(id);
if (u != null && u.Id > 0)
{
NHibernateUtil.Initialize(u.UserDocuments);
}
return u;
Run Code Online (Sandbox Code Playgroud)
在我的web.config里面<httpModules> …
当数据对象模型发生更改(向类中添加新属性)时,是否有一种方法可以使用流畅的自动化来更改模式,目前它只会删除并重新创建数据库模式,这会丢失数据库中的所有数据.它可以使用Alter表而不是drop/create table,还是我只是在做梦?
可以根据自动化流程更新数据库模式而不会丢失数据吗?
干杯,
nhibernate nhibernate-mapping fluent-nhibernate schemaexport automapping
我在使用Fluent NHibernate中的Automapper在NHibernate中保存连接记录时遇到了多个问题.
关于这一点还有不少其他帖子,但到目前为止,他们都没有解决问题,想知道我是否正在做一些与众不同的事情.
我有应用程序设置映射,当我在数据库中手动创建连接记录时,我确实取回了数据,因此在读取级别上它正确映射,但它不会保持关系.
这是相关的映射.我使用默认约定的automapper,但最终根据另一个SO帖子尝试了这个.
.Mappings(m => {
m.AutoMappings.Add(AutoMap.AssemblyOf<User>);
m.AutoMappings.Add(AutoMap.AssemblyOf<PostalCode>);
m.AutoMappings.Add(
AutoMap.AssemblyOf<VPA>()
.Override<VPA>(v =>
v.HasManyToMany(x => x.PostalCodes)
.Table("PostalCodesToVPAs")
.ParentKeyColumn("PostalCode_Id")
.ChildKeyColumn("VPA_Id")
.Cascade.SaveUpdate())
.Override<PostalCode>(p =>
p.HasManyToMany(x => x.VPAs)
.Table("PostalCodesToVPAs")
.ParentKeyColumn("VPA_Id")
.ChildKeyColumn("PostalCode_Id")
.Cascade.SaveUpdate().Inverse())
);
})
Run Code Online (Sandbox Code Playgroud)
我的实际保存看起来像这样.它可能是矫枉过正,因为我明确地保存邮政编码和vpa,但我读了很多关于人们在映射中有反向线问题的人,所以我想尝试两者.它没用.
var postalCode = new PostalCode {Value ="90210", CreatedBy = 0, CreationDate = DateTime.Now, ModifiedBy = 0, ModifiedDate = DateTime.Now};
vpa.PostalCodes.Add(postalCode);
postalCode.VPAs.Add(vpa);
PostalCodeService.Save(postalCode);
VPAService.Save(vpa);
Run Code Online (Sandbox Code Playgroud)
在封面下,service.save调用了
return (int)Session.Save(obj);
Run Code Online (Sandbox Code Playgroud)
有谁看过这个,知道为什么它不会保存连接记录?
我不明白为什么它会覆盖我的整个对象.原因是我User从db 获取对象,我想从DTO分配新值.它不是仅仅添加这些新值,而是创建具有新值但前面所有值都设置为的新对象null.
我怎样才能确保在这种情况下他会"升级"我的对象,而不是创建新对象?
/users/{id} - PUT
// User has id, username, fullname
// UserPut has fullname
public HttpResponseMessage Put(int id, UserPut userPut)
{
var user = _db.Users.SingleOrDefault(x => x.Id == id); // filled with properties
Mapper.CreateMap<UserPut, User>();
user = Mapper.Map<User>(userPut); // now it has only "fullname", everything else set to null
// I can't save it to db because everything is set to null except "fullname"
return Request.CreateResponse(HttpStatusCode.OK, user);
}
Run Code Online (Sandbox Code Playgroud) 我想创建 AutoMapper 的静态实现而不需要依赖注入。我正在使用 ASP.NET CORE 2.2 和 AutoMapper 9。我发现了类似的主题:
如何在Asp.Net Web Api 2中使用AutoMapper 9.0.0而不需要依赖注入?
有没有更简单的方法来创建无需 DI 的静态实现?
更新:这个东西已经演变成一个很好的项目,请访问http://valueinjecter.codeplex.com
那么告诉我你怎么看?
我这样做了所以我可以这样做:
Product –> ProductDTO
ProductDTO –> Product
Run Code Online (Sandbox Code Playgroud)
它是如何开始的:
我在我的Inputs/Dto/ViewModels for DropDowns中使用"object"类型,因为我向html发送了一个IEnumerable <SelectListItem>并且我收到了一个选定键的字符串数组
public void Map(object a, object b)
{
var pp = a.GetType().GetProperties();
foreach (var pa in pp)
{
var value = pa.GetValue(a, null);
// property with the same name in b
var pb = b.GetType().GetProperty(pa.Name);
if (pb == null)
{
//no such property in b
continue;
}
if (pa.PropertyType == pb.PropertyType)
{
pb.SetValue(b, value, null);
}
}
}
Run Code Online (Sandbox Code Playgroud)
更新:
实际用法:
Build方法(Input = Dto):
public …Run Code Online (Sandbox Code Playgroud) 我有一个像这样的实体:
public class Land
{
public virtual IDictionary<string, int> Damages { get; set; }
// and other properties
}
Run Code Online (Sandbox Code Playgroud)
每次我尝试使用以下代码自动化:
var sessionFactory = Fluently.Configure()
.Database(SQLiteConfiguration.Standard.InMemory)
.Mappings(m => m.AutoMappings.Add(AutoMap.AssemblyOf<Land>))
.BuildSessionFactory();
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
{"The type or method has 2 generic parameter(s), but 1 generic argument(s) were
provided. A generic argument must be provided for each generic parameter."}
Run Code Online (Sandbox Code Playgroud)
有人能告诉我我做错了什么吗?此外,这只是一个简单的例子.我有更多的词典而不仅仅是这个词典.
我有以下类,我使用Fluent NHibernate的AutoMapper进行映射.我不希望列表项可以公开修改,因此有一个公共IEnumerable支持IList,可以在内部或NHibernate填充.
我希望NHibernate映射teamMembers到一个名为的列TeamMembers.我也希望FNH忽略TeamMembers这个类的属性.
public class Team : Entity
{
protected internal virtual IList<Person> teamMembers { get; set; }
public IEnumerable<Person> TeamMembers { get { return teamMembers;} }
}
Run Code Online (Sandbox Code Playgroud) c# nhibernate nhibernate-mapping fluent-nhibernate automapping
说我有这些模型:
public class Person
{
public virtual int Id { get; private set; }
public virtual ICollection<Address> Addresses { get; private set; }
}
public class Address
{
public virtual int Id { get; private set; }
public virtual Person Person { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我希望FluentNHibernate创建以下表:
Person
PersonId
Address
AddressId
PersonId
Run Code Online (Sandbox Code Playgroud)
这可以通过使用流畅的映射轻松实现:
public class PersonMapping : ClassMap<Person>
{
public PersonMapping()
{
Id(x => x.Id).Column("PersonId");
HasMany(x => x.Addresses).KeyColumn("PersonId");
}
}
public class AddressMapping : ClassMap<Address>
{
public AddressMapping()
{
Id(x …Run Code Online (Sandbox Code Playgroud) 我使用Fluent NHibernate和自动功能.现在我正在寻找像配置,设置,自定义属性 - 无论如何 - 将实体属性声明为"ReadOnlyFromDb"
在MsSql数据库中,我在其中一个表中使用计算列,其中根据特定数据行的某些其他值计算值.现在我已将实体类中的此列声明为
public virtual int STATUS { get; private set; }
Run Code Online (Sandbox Code Playgroud)
获取表格的具体数据一切正常.STATUS使用数据表中的特定值填充属性.
当我尝试SaveUpdate()特定对象时出现问题.我总是得到例外
A computed column cannot be the target of an INSERT or UPDATE statement
Run Code Online (Sandbox Code Playgroud)
这对我的理解是正确的 - 以及它应该如何;)!
基本上我正在寻找配置,设置,自定义属性 - 无论如何 - 要说
Hey Fluent NHibernate - 获取特定属性
propertyName但不插入/更新属性propertyName
有类似的东西吗?或者这种情况是否存在解决方法?我搜索了流利的nhibernate wiki,但没有找到一个smilliar案例.
我希望有人已经面对并解决了这个问题!
以下是我创建会话的代码片段(可能有帮助):
public static ISessionFactory GetNHibernateSession()
{
if (nhibernateSession != null)
return nhibernateSession;
if (ConfigurationManager.AppSettings[msSqlConnectionString] == null || ConfigurationManager.AppSettings[msSqlConnectionString] == String.Empty)
throw new NullReferenceException(String.Format("AppSetting '{0}' must not …Run Code Online (Sandbox Code Playgroud) automapping ×12
nhibernate ×5
c# ×4
automapper ×3
asp.net-mvc ×2
asp.net-core ×1
automapper-2 ×1
dictionary ×1
dto ×1
fluent ×1
mapping ×1
schemaexport ×1