【问题标题】:Fluent nHibernate reference by Id (not by object)流利的 nHibernate 按 Id 引用(不是按对象)
【发布时间】:2016-04-28 10:57:58
【问题描述】:

我有一个类User,在系统的核心模块中:

public class User
{
    public virtual int Id {get; set;}
    public virtual string Name {get; set; }
}

我还有一个类Company,它在系统的另一个模块中,没有对核心模块的引用:

public class Company
{
    public virtual int Id {get; set;}
    public virtual string Name {get; set; }
    public virtual int OwnerUserId {get; set;}
}

如何创建 Company.OwnerUserId 的映射作为数据库中 User.Id 的外键?再次注意:此映射不能引用“用户”类。

【问题讨论】:

  • 你为什么不用Map(x => x.OwnerUserId)
  • 那不会生成外键吧?
  • 您是否使用 nhibernate 进行数据库迁移?
  • 在申请中 - 没有。在测试中,我使用 nHibernate 来生成整个数据库。当然,我可以将它添加到应用程序或测试的迁移脚本中。但是我想知道是否对此有“本机”支持?
  • 没有。每个模块只看到它的映射。但是,“用户”永远不会被删除(仅标记为“已删除”),因此外键引用是可接受的解决方案。

标签: c# nhibernate fluent-nhibernate database-migration fluent-nhibernate-mapping


【解决方案1】:

这是一种解决方法,我不确定架构更新将如何在没有映射引用的情况下生成外键来获取元数据。

您可以创建一个映射到同一张表的新实体:

public class LocalUser
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
}

public class Company
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual LocalUser OwnerUserId { get; set; }
}

public class LocalUserMap : ClassMap<LocalUser>
{
    public LocalUserMap()
    {
        Table("[User]");
        Id(x => x.Id).GeneratedBy.Identity();
        Map(x => x.Name);
    }
}

【讨论】:

  • 添加一个映射到同一张表的新实体对我来说是一个完美的解决方法。是否有机会拥有 int 类型的属性“OwnerUserId”而不是字符串?只是在模型中指出这是边界,我可以在该模块中使类 LocalUser 过时(因为尽管映射它应该在任何地方使用)。
  • 我不明白,在哪个类中创建附加属性?
  • 不是附加属性。我希望实体公司为: public class Company { (...) public virtual int OwnerUserId { get;放; } } 我不介意 LocalUser(在项目中),但不介意在 Company 中作为属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 1970-01-01
  • 2015-11-22
相关资源
最近更新 更多