我已经被提交并已经开始学习Fluent NHibernate(没有以前的NHibernate经验).在我的项目中,我正在编程接口以减少耦合等.这意味着几乎所有"一切"都指的是接口而不是具体类型(IMessage而不是Message).这背后的想法是通过能够模拟依赖关系来帮助使其更易于测试.
然而,(流利的)当我尝试映射到接口而不是具体类时,NHibernate并不喜欢它.问题很简单 - 根据Fluent Wiki,定义我的类的ID字段是明智的
int Id { get; private set; }
获取典型的自动生成的主键.但是,这只适用于具体的类 - 我不能在接口上指定访问级别,同一行必须是这样
int Id { get; set; }
并且我认为否定在具体类中使setter私有(想法是只有NHibernate应该将ID设置为由DB分配).
就目前而言,我想我只会公开制定者并试图避免写入它的诱惑..但是有没有人知道什么是"正确的",最佳实践方式来创建一个正确的主键只有NHibernate可以写入的字段,而仍然只编程到接口?
更新
根据我从mookid和James Gregory的两个答案之后的理解,我可能走错了路 - 我不应该有理由让每个实体拥有一个接口,就像我现在一样.这一切都很好.我想我的问题就变成了 - 是否没有理由对任何实体的接口进行100%编程?如果甚至有一种情况可以证明这是合理的,那么可以用(流利的)NHibernate做到这一点吗?
我问,因为我不知道,不要批评.谢谢你的回复.:)
我正在使用两个类NiceCustomer和RoughCustomer接口界面ICustomer.
将ICustomer具有四个属性.他们是:
Property Id() As IntegerProperty Name() As StringProperty IsNiceCustomer() As BooleanReadOnly Property AddressFullText() As String我不知道如何将接口映射ICustomer到数据库.
我在内部异常中遇到这样的错误.
关联是指未映射的类:ICustomer
我正在使用Fluent和NHibernate.
我正在使用最新版本的Entity Framework(4.2)并尝试为我的实体实现接口,并且出于某种原因,它没有编译.它正在抛出错误" Cannot convert expression type ICollection<IOrder> to return type ICollection<Order>".如果我不为实体使用接口,那么我不会收到此错误.
我有一个单独的接口项目(用于存储库和服务等),我需要将这些方法中的EF实体作为参数传递,我不想传递它们中的实际实体,因为这将需要接口项目具有对EF实体的依赖.
我的目标有点类似于本文中提到的那个我可以从我的实体中抽象实体框架吗?
这是样本.我只是在这里放一个样本,我的实际实体是不同的,但问题是一样的.
public interface IOrder
{
    int OrderId { get; set; }
    int CustomerId { get; set; }
    ICustomer Customer { get; set; }
}
public class Order : IOrder
{
    public int OrderId { get; set; }
    public int CustomerId { get; set; }
    ICustomer Customer { get; set; }
}
public interface ICustomer
{
    int CustomerId { get; set; }
    ICollection<IOrder> Orders { get; …有没有办法在EF6中使用接口作为导航属性?我找到了EF4或更早版本的相关主题,似乎不太可能; 一般来说,从那时起,继承似乎已经有了很大的改进,但我还没有找到办法使这个特定问题发挥作用.
例:
public interface IPerson
{
  string name { get; set; }
}
public class Man : IPerson { /* ... */ }
public class Woman : IPerson { /* ... */ }
public interface ICar
{
  IPerson driver { get; set; }
}
public class Car : ICar
{
  public virtual IPerson driver { get; set; }  // This won't map
}
这有可能吗?如果没有,那么做什么是明智的方法呢?
因为目前我没有看到任何方式让接口有一个可设置的属性,其类型是其他接口(例如ICar的IPerson属性),哪种打击我作为一个非常严重的设计限制?!
我有以下类,它是数据库表的模型:
public class User : IUser
{
    internal int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public ITest TestData { get; set; }
}
当我运行Update-Database命令时,它抛出一个错误:
该属性
User.TestData属于接口类型 (ITest)。如果它是导航属性,则通过将其转换为映射实体类型来手动配置此属性的关系
如果我不希望实际属性是一个类,我如何以及在哪里可以手动配置此属性的关系?
我使用适配器能够将接口而不是具体类型插入dbcontext.适配器可以独立工作,但是我无法将任何一对一(父子)关系保存到数据库中:
public void SaveDomain(IDomain domain){
    _entityRepositor = new Donors();
    _entityRepositor.DomainReps.Add(new DomainRep(domain));                
}
Conflicting changes to the role 'DomainRep_TopLevelDomainRep_Target' of the relationship 'Edonics.Repositor.DomainRep_TopLevelDomainRep' have been detected.
public class DomainRep: IDomain
{
    private readonly IDomain _adaptee;        
    public DomainRep(IDomain adaptee)
    {
        _adaptee = adaptee;
    }
    [NotMapped]
    public IDomain Adaptee
    {
        get { return _adaptee; }
    }
    public string Id
    {
        get { return _adaptee.Id; }
        set { _adaptee.Id = value; }
    }
    public string TopLevelDomainRepId
    {
        get { return _adaptee.Tld.Id; …