我有两个类,所以:
public class SentEmailAttachment : ISentEmailAttachment
{
public SentEmailAttachment();
public string FileName { get; set; }
public string ID { get; set; }
public string SentEmailID { get; set; }
public string StorageService { get; set; }
public string StorageServiceFileID { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
和
public class SentEmailAttachmentItem : ISentEmailAttachment
{
[ItemName]
public string ID { get; set; }
public string SentEmailID { get; set; }
public string FileName { get; set; }
public string StorageService { get; set; …Run Code Online (Sandbox Code Playgroud) 我一直在尝试使用AutoMapper来节省从我的DTO到我的域对象的时间,但是我在配置地图时遇到了麻烦,以至于它工作正常,我开始怀疑AutoMapper是否可能是错误的工具工作.
考虑这个域对象的例子(一个实体和一个值):
public class Person
{
public string Name { get; set; }
public StreetAddress Address { get; set; }
}
public class StreetAddress
{
public string Address { get; set; }
public string City { get; set; }
public string State { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的DTO(来自Linq-to-SQL对象)的出现大致如下:
public class PersonDTO
{
public string Name { get; set; }
public string Address { get; set; }
public string City { get; set; }
public string State { get; set; } …Run Code Online (Sandbox Code Playgroud) 我正在开始一个新项目,我想使用NHibernate 3.2.我知道它现在可以做类似于FluentNHibernate的事情,我想尝试一下.
但是我很难找到关于Loquacious API的文档.我已经看过关于如何配置ISessionFactory的博客 文章,但在此之后我就迷路了.我知道3.2 API正在快速发展,大约3到4个月的文章已经过时,但我正在寻找最新的信息.
我在哪里可以找到有关的资源:
如何在不使用FluentNHibernate且不使用ConfORM的情况下设置NHibernate 3.2而不使用XML?
如何注册映射?
如何创建约定?
请记住,这与NHibernate 3.2(可能在上面)有关.如果映射和约定等任何概念不再适用,请您指出正确的方向吗?
我对NHibernate和FluentNHibernate有一些经验,因为我将它们用于一个小项目,但它并不是很复杂.
我在使用EF和AutoMapper时遇到了一些问题.= /
例如 :
我有2个相关实体(客户和订单),他们是DTO课程:
class CustomerDTO
{
public string CustomerID {get;set;}
public string CustomerName {get;set;}
public IList< OrderDTO > Orders {get;set;}
}
class OrderDTO
{
public string OrderID {get;set;}
public string OrderDetails {get;set;}
public CustomerDTO Customers {get;set;}
}
//when mapping Entity to DTO the code works
Customers cust = getCustomer(id);
Mapper.CreateMap< Customers, CustomerDTO >();
Mapper.CreateMap< Orders, OrderDTO >();
CustomerDTO custDTO = Mapper.Map(cust);
//but when i try to map back from DTO to Entity it fails with AutoMapperMappingException.
Mapper.Reset();
Mapper.CreateMap< CustomerDTO …
Run Code Online (Sandbox Code Playgroud) 如果我有一个标记为a的类DataContract和一些标记有DataMember属性的属性,我可以轻松地将其序列化为XML,但它会创建如下的输出:
<Person>
<Name>John Smith</Name>
<Email>john.smith@acme.com</Email>
<Phone>123-123-1234</Phone>
</Person>
Run Code Online (Sandbox Code Playgroud)
我更喜欢的是属性,比如......
<Person Name="John Smith" Email="john.smith@acme.com" Phone="123-123-1234" />
Run Code Online (Sandbox Code Playgroud)
该DataMember属性允许我控制名称和顺序,但不能控制它是否被序列化为元素或属性.我环顾四周找到了DataContractFormat,IXmlSerializable但我希望有更简单的解决方案.
最简单的方法是什么?
它看起来像是一个IValueFormatter类型的值object并返回一个类型的值string,而a ValueResolver<TSource, TDestination>取任何类型的值并返回任何类型的值.所以,它更灵活.还有一个问题是,使用a ValueResolver,您永远不需要将源转换为特定类型 - 您可以在类定义中明确定义它.
鉴于此,为何使用IValueFormatter?它做了什么不能做的事情ValueResolver吗?我误解了它是如何工作的吗?
调用以下代码中的Get工作正常:
public class ContractService : IContractService
{
private readonly IRepository<Contract> repository;
public ContractService(IRepository<Contract> repository)
{
this.repository = repository;
}
public Contract Get(int contractId)
{
return repository.Query().Where(x => x.Id == contractId).FirstOrDefault();
}
Run Code Online (Sandbox Code Playgroud)
但是当我这样做时:
public class ContractService : CRUDService<Contract>, IContractService
{
public ContractService(IRepository<Contract> repository) : base(repository)
{
}
}
public class CRUDService<TEntity> : ICRUDService<TEntity> where TEntity : IEntity
{
protected readonly IRepository<TEntity> repository;
public CRUDService(IRepository<TEntity> repository)
{
this.repository = repository;
}
public TEntity Get(int id)
{
var entities = this.repository.Query().Where(s => s.Id …Run Code Online (Sandbox Code Playgroud) 标题几乎解释了这一切,我有一个成员对象,引用也是类型成员的'朋友'.
public class Member : Entity
{
public Member()
{
Friends = new List<Member>();
}
public virtual IList<Member> Friends
{
get; set;
}
}
Run Code Online (Sandbox Code Playgroud)
模式生成工具使其成为1:n关系,而它应该是:n关系,即将列添加到名为member_id的成员表中,并且不创建连接表.
有没有办法让自我在Fluent NHibernate中引用多对多的关系?
我尝试使用之前得到的覆盖作为答案:
public class MemberOverride : IAutoMappingOverride<Member>
{
public void Override(AutoMapping<Member> mapping)
{
mapping.HasManyToMany(m => m.Friends)
.Table("MemberFriendsLinkTable");
}
}
Run Code Online (Sandbox Code Playgroud)
但我收到错误信息:
"NHibernate.MappingException:集合映射中的重复列:Proj.BO.Member.Friends列:Member_id"
谢谢
编辑:我找到了答案,它是:
mapping.HasManyToMany(m => m.Friends).ParentKeyColumn("Member_Id").ChildKeyColumn("Friend_Id")
.Table("MemberFriendsLinkTable").Inverse().Cascade.SaveUpdate();
Run Code Online (Sandbox Code Playgroud) 这是我的情况..
假设您有以下模型实体,它们自己代表单个表:
Movies [Movie_Id,Title,Rating,..]
Actors [Actor_Id,FirstName,LastName,..]
Director [Director_Id,FirstName,LastName ,..]
和另一个名为"Recommendations"的实体/表,它代表网站内用户之间的建议.这个想法是推荐可以是任何类型,即推荐演员或推荐电影的人.基本上,表格看起来应该是这样的:
建议书 [Recommendation_Id,Object_Id,Object_Type,..]
这就是我坚持的内容.如何在nHibernate中使用Fluent映射这些关系?我的意思是..在映射时,我不能指定Type(与哪个表相关)'因为它是在运行时确定的,但我不能仅仅依赖于Id'因为它本身并不意味着它属于哪个表.
例如,想象一下在Recommendations表上的这条记录:
Recommendation_Id - Object_Id - Object_Type
83001--4010123 ---"M"
基本上我存储一个字符标识符(在本例中为"M"代表表"Movies")知道Object_Id属于哪个表.我不能只在没有Object_Type的情况下存储Object_Id ..
作为最后的评论,我想补充一点,我已经看到了所有每个类的表,每个子类的表,每个具体的表类示例,但我相信这些都不适合这种情况,因为Movies_Id,Actors_Id,Directors_Id,......在它们之间都是不同的,所以Recommendations_Id也是如此.我的意思是,这里没有基类 - 子类继承,它们根本不共享Id.
我希望我能说清楚.提前致谢.
在EAV系统中,我有一个如下所示的映射:
<class name="Record">
<map name="Values" table="RecordFieldValue">
<key column="RecordFK">
<index column="FieldFK">
<element column="Value">
</map>
</class>
Run Code Online (Sandbox Code Playgroud)
我想选择一些记录,按特定字段的每个记录的值排序.但请注意,并非所有记录实际上都具有该字段的值.在这种情况下,仍应提取记录并使用空值进行排序.
所需的SQL如下所示:
select rec.*, val.Value
from Record rec
left outer join RecordFieldValue val
on val.RecordFK = rec.PK and val.FieldFK = :field
order by val.Value
Run Code Online (Sandbox Code Playgroud)
经过大量挖掘后,我发现在HQL中修改左连接的"on"子句的正确方法是使用"with"关键字(参见https://nhibernate.jira.com/browse/NH-514) .所以我尝试了这个HQL:
from Record rec
left join rec.Values vals with index(vals) = :field
order by vals
Run Code Online (Sandbox Code Playgroud)
不幸的是,这会产生以下错误:with子句表达式没有引用与子句相关联的from子句元素.所以我尝试了这个:
from Record rec
left join rec.Values vals with index(rec.Values) = :field
order by vals
Run Code Online (Sandbox Code Playgroud)
但是这产生了一个新的错误:with子句只能引用驱动表中的列.
有关如何使这项工作的任何想法?谢谢.
- 布莱恩
c# ×5
nhibernate ×5
automapper ×4
mapping ×3
.net ×2
datacontract ×1
dto ×1
hql ×1
left-join ×1
sql-order-by ×1