Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Fluent NHibernate映射-将n-m转换为1-n关系_C#_Nhibernate_Fluent Nhibernate - Fatal编程技术网

C# Fluent NHibernate映射-将n-m转换为1-n关系

C# Fluent NHibernate映射-将n-m转换为1-n关系,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,我创建了三个实体: public class Company : EntityBase { some properties public virtual IList<UserCompanyAttachment> AttachedUsers {get; set;} public virtual void AttachUser(User userToAttach) { var userCompanyAttachment = new UserComp

我创建了三个实体:

public class Company : EntityBase
{
   some properties
   public virtual IList<UserCompanyAttachment> AttachedUsers {get; set;}

   public virtual void AttachUser(User userToAttach)
   {
       var userCompanyAttachment = new UserCompanyAttachment()
       {
           AttachedCompany = this,
           AttachedUser = userToAttach
       }
       AttachedUsers.Add(userCompanyAttachment);
   }
}

public class User : EntityBase
{
   some properties
   public virtual IList<UserCompanyAttachment> AttachedCompanies {get; set;}

   public virtual void AttachCompany(Company companyToAttach)
   {
       var userCompanyAttachment = new UserCompanyAttachment()
       {
           AttachedCompany = companyToAttach,
           AttachedUser = this
       }
       AttachedCompanies.Add(userCompanyAttachment);
   }
}

public class UserCompanyAttachment : EntityBase
{
    public virtual User AttachedUser { get; set; }
    public virtual Company AttachedCompany { get; set; }
     .. some properties ..
}
UserCompanyAttachemnt映射为:

References(x => x.AttachedUser);
References(x => x.AttachedCompany);
我之所以没有创建正常的多对多关系,是因为我需要存储有关附件的信息。(在这两种情况下,没有冗余,因为第三个表将在数据库中实际存在)但是,当我尝试使用
companyObject.AttachUser.AttachUser(newUser)
附加用户时,更改仅在
company.AttachedUsers
上可见,而在
newUser.AttachedCompanies
中不可见。有没有办法通过一些映射来推动更改?为什么会失败

编辑:添加了失败的单元测试

    [Test]
    public void CanCorrectlyMapUserCompanyAttachmentWhenAddedByUser()
    {
        var testUser = new User() { PasswordHash = "pp", PasswordSalt = "qq", Username = "user" };
        var testCompany = new Company()
        {
            Address = new Address() { City = "q" },
            AgentName = "tt",
            Comments = "z",
            CompanyName = "g",
            MailAddress = "@@",
            NIP = 231123
        };

        DbSession.Save(testUser);
        DbSession.Save(testCompany);
        testUser.AttachCompany(testCompany);
        DbSession.Flush();

        var addedAttachment = DbSession.Get<UserCompanyAttachment>(1);

        User addedUser = DbSession.Get<User>(1);
        Company addedCompany = DbSession.Get<Company>(1);

        Assert.AreEqual(addedAttachment .AttachedUser.Id, 1);
        Assert.AreEqual(addedAttachment .AttachedCompany.Id, 1);
        Assert.IsTrue(addedUser.AttachedCompanies.Contains(addedAttachment));
        Assert.IsTrue(addedCompany.AttachedUsers.Contains(addedAttachment)); // here it fails
    }
[测试]
public void可以在用户()添加时正确映射用户公司附件
{
var testUser=new User(){PasswordHash=“pp”,PasswordSalt=“qq”,Username=“User”};
var testCompany=新公司()
{
地址=新地址(){City=“q”},
AgentName=“tt”,
Comments=“z”,
CompanyName=“g”,
MailAddress=“@@”,
NIP=231123
};
DbSession.Save(testUser);
DbSession.Save(测试公司);
testUser.AttachCompany(testCompany);
DbSession.Flush();
var addedAttachment=DbSession.Get(1);
用户addedUser=DbSession.Get(1);
公司addedCompany=DbSession.Get(1);
Assert.AreEqual(addedAttachment.AttachedUser.Id,1);
Assert.AreEqual(addedAttachment.AttachedCompany.Id,1);
Assert.IsTrue(addedUser.AttachedCompanies.Contains(addedAttachment));
Assert.IsTrue(addedCompany.AttachedUsers.Contains(addedAttachment));//此处失败
}
这里的问题是:

  • 我们在C#中没有将配对实例
    UserCompanyAttachment
    分配到
    AttachedUsers
    集合中(属于
    公司
    实例
    测试公司
  • 我们没有让NHibernate从DB重新加载所有三个(刚刚创建的实例)。仍然从会话返回的所有对象—其第一级缓存
因此,我们可以做的是:

1) 同时将配对对象分配到公司的集合
AttachedUsers
。但我不会把这件事复杂化太多。因为我们的操作应该是读或写。而且每个人都应该有自己的独立/唯一会话。(即不共享一级缓存)

2) 首选的方法是将其保留在NHibernate上。正如我们所期望的那样,这个很棒的工具将填充所有的集合。只需要允许它重新加载数据库中的所有内容。怎么用?只需一行代码:

// creation of all the stuff in the unit test 
...
...
DbSession.Flush();

// new line - essential setting - clearing the first level cache
DbSession.Clear();

// the test continues as it was... passing all assertion
...
简单的语句:
DbSession.Clear()是成功的关键。为什么?因为NHibernate现在可以完全访问基于DB数据的正确实例化。。。不是关于C#中的“弱集关系”

这将是首选的方式:拆分写和读==让NHibernate填充我们的对象,它将正确地完成

// creation of all the stuff in the unit test 
...
...
DbSession.Flush();

// new line - essential setting - clearing the first level cache
DbSession.Clear();

// the test continues as it was... passing all assertion
...