我有以下场景
public abstract class BaseClass
{
public virtual int Id {get; set};
public virtual string Name {get; set;}
}
public class FirstSubClass : BaseClass
{
//properties and behaviour here
}
public class SecondSubClass : BaseClass
{
//properties of SecondSubclass Here
}
public class ProcessStep
{
public virtual IList<BaseClass> ContentElements {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
对于映射我使用了以下代码片段: -
this._sessionFactory =
Fluently.Configure().Database(SQLiteConfiguration.Standard
.ConnectionString(@"Data Source=SqliteTestSqlDataAccess.s3db; Version=3; New=True; Pooling=True; Max Pool Size=1;"))
.Mappings(m => m.AutoMappings.Add(AutoMap.Assembly(assemblyWithDomainClasses).Conventions.Add(DefaultCascade.All())))
.ExposeConfiguration(BuildSchema)
.BuildSessionFactory();
Run Code Online (Sandbox Code Playgroud)
默认情况下,fluent将忽略作为BaseClass的抽象基类.但是在ProcessStep类中有返回IList的属性ContentElements ,我得到一个异常: - NHibernate.MappingException:关联引用未映射的类:BaseClass
如果我使用IncludeBase(typeof(BaseClass))包含基类,那么它工作正常,但它为BaseClass和Derived类创建一个表,并且记录与FK-PK关系(每个子类的表 …
nhibernate abstract-class fluent-nhibernate automapping table-per-class
可能有人帮忙,我如何指示automap对列不为null?
public class Paper : Entity
{
public Paper() { }
[DomainSignature]
[NotNull, NotEmpty]
public virtual string ReferenceNumber { get; set; }
[NotNull]
public virtual Int32 SessionWeek { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
但我得到以下内容:
<column name="SessionWeek"/>
Run Code Online (Sandbox Code Playgroud)
我知道可以使用流利地图完成.但我想以自动映射的方式知道它.
如果使用Fluent NHibernate,是否可以自动化大多数类,但是指定应该使用常规流畅的API映射几个特定的类而不是自动化?如果是这样,有人能指出一些示例代码,说明如何做到这一点吗?
谢谢!
鉴于以下类别:
public class Address : Place
{
public virtual string Street { get; set; }
public virtual int Number { get; set; }
public override string WhereAmI
{
get { string.Format("{0} {1}", Street , Number); }
}
}
public abstract class Place : DomainEntity
{
public abstract string WhereAmI { get; }
}
Run Code Online (Sandbox Code Playgroud)
当我使用此映射时:
var autoMap = AutoMap.AssemblyOf<Party>()
.Override<Place>(map => map.IgnoreProperty(p => p.WhereAmI))
.Override<Address>(map => map.IgnoreProperty(p => p.WhereAmI))
.Where(type => type.Namespace != null && type.Namespace.Contains("Models"));
Run Code Online (Sandbox Code Playgroud)
我仍然得到错误:无法在"地址"类中找到属性'WhereAmI'的setter
我做的事情:
我本周刚开始关注NHibernate,并希望在我当前的项目中使用Automapping方法.
我正在使用Fluent NHibernate 1.0.0.594,这是我几天前下载的.
我在NHibernate源代码中找到了Examples.FirstProject,它使用了旧式的实体映射.作为NHibernate的介绍,这对我来说非常有价值,因为它可以直接使用.
但是,我一直无法为AutoMapping找到类似的独立工作示例.Peter Bromberg 发布了一个看起来不错的样本,但它似乎缺少一些重要的组件.他一直在帮助我尝试解决问题,但它还没有奏效.
接下来,我尝试修改Examples.FirstProject程序以使用自动映射,但是立即遇到了抛出异常的问题,而我目前的经验水平并不理解.
任何人都可以指向一个已知使用最新的NHibernate代码的Automapping示例项目吗?
似乎NHibernate不能自动化实体中给定类型的多个IList.
考虑以下两个实体(基于Fluent NHibernate源代码中包含的Examples.FirstProject示例代码).
public class Employee
{
public virtual int Id { get; private set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
}
public class Store
{
public virtual int Id { get; private set; }
public virtual IList<Employee> Staff { get; set; }
public virtual IList<Employee> Managers { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这似乎是一个完全有效的对象模型 - 每个商店都有几名员工和几名经理员工.
但是当我自动化时,Staff和Managers列表存储在Employee表中,所有这些列表都具有相同的外键.
Employee Table
Id FirstName LastName Store_id
3 Daisy Harrison 1
4 Jack Torrance …Run Code Online (Sandbox Code Playgroud) 我正在使用ValueInjecter将属性从域模型映射到通过服务层提供的DTO.有问题的服务也接受更新...因此传入更新的DTO,然后将其注入域对象并保存.
// Domain
public class Member
{
public Country Country { get; set; }
}
public class Country
{
public string Code { get; set; }
public string Name { get; set; }
}
//Dto
public class MemberDto
{
public string CountryCode { get; set; }
}
//Transformation Method attempt 1
public Member InjectFromDto (MemberDto dto, Member source)
{
source = source.InjectFrom<UnflatLoopValueInjection>(dto);
return source;
}
Run Code Online (Sandbox Code Playgroud)
现在所有上面的代码都更新了Property Member.Country.Code,这显然不是我需要它做的.
所以从文档中,我想我需要创建一个覆盖并得到这个:
public class CountryLookup: UnflatLoopValueInjection<string, Country>
{
protected override Country SetValue(string …Run Code Online (Sandbox Code Playgroud) 我的所有实体和值对象都实现了标记接口IEntity和IValueObject.我把它们设置为像这样的组件:
public override bool IsComponent(Type type)
{
return typeof(IValueObject).IsAssignableFrom(type);
}
public override bool ShouldMap(Type type)
{
return typeof(IEntity).IsAssignableFrom(type) || typeof(IValueObject).IsAssignableFrom(type);
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这似乎不允许将具有值对象集合的实体自动化为组件集合.例如:
public class MyEntity : IEntity
{
public IList<MyValueObject> Objects { get; set; }
}
public class MyValueObject : IValueObject
{
public string Name { get; set; }
public string Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
有没有办法定义一个约定,这样,只要IEntity有IList一个类型实现IValueObject,它就像我指定的那样被映射:
HasMany(x => x.Objects)
.Component(x => {
x.Map(m => m.Name);
x.Map(m => m.Value); …Run Code Online (Sandbox Code Playgroud) nhibernate components fluent-nhibernate automapping value-objects
我感觉dejavu,但我找不到答案:我有一个对象数组,在检查jQ $ .post调用时需要看起来像这样:
limiter[0].Key
limiter[0].Value
Run Code Online (Sandbox Code Playgroud)
以便它在动作中映射
public ActionResult SomeAction(Dictionary<Guid, string> dictionary) { }
Run Code Online (Sandbox Code Playgroud)
但是,这个javascript:
// Some Guid and Some Value
var param = [ { 'Key' : '00000000-0000-00000-000000', 'Value': 'someValue' } ];
$.post('/SomeController/SomeAction/',
{
dictionary: limiter,
otherPostData: data
},
function(data) {
callback(data);
}
)
Run Code Online (Sandbox Code Playgroud)
在用firebug检查时产生这个:
limiter[0][Key] = someKey // Guid Value
limiter[0][Value] = someValue
Run Code Online (Sandbox Code Playgroud)
这是在jq 1.4.2.我似乎记得你需要设置一些标志来在jQ中以不同的方式渲染json.这会响铃吗?
我有这种情况:
public namespace ANamespace
{
public abstract class ABase:IABase
{
//properties
}
public abstract class A : ABase
{
//properties
}
public class A1 : A
{
//properties
}
public class A2 : A
{
//properties
}
}
Run Code Online (Sandbox Code Playgroud)
如果我使用此映射代码:
AutoMap
.AssemblyOf<ABase>()
.Where(e => e.Namespace == "ANamespace")
.IncludeBase<A>().IgnoreBase<ABase>();
Run Code Online (Sandbox Code Playgroud)
仅创建一个表(具有ABase和A属性).如果我删除IncludeBase(),则创建A1和A2(包含所有属性).
AutoMap
.AssemblyOf<ABase>()
.Where(e => e.Namespace == "ANamespace")
.IgnoreBase<ABase>();
Run Code Online (Sandbox Code Playgroud)
如何编写映射以在我的数据库中为类A(具有所有A和ABase属性),A1和A2(具有特定属性)而不是ABase类创建表?
automapping ×10
nhibernate ×7
fluent ×2
asp.net-mvc ×1
c# ×1
components ×1
convention ×1
dto ×1
inheritance ×1
javascript ×1
jquery ×1
nullable ×1