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重新加载所有三个(刚刚创建的实例)。仍然从会话返回的所有对象—其第一级缓存
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
...