cho*_*bo2 22 c# nhibernate fluent-nhibernate
我该怎么做我试图做一对一的映射.
public class Setting
{
public virtual Guid StudentId { get; set; }
public virtual DateFilters TaskFilterOption { get; set; }
public virtual string TimeZoneId { get; set; }
public virtual string TimeZoneName { get; set; }
public virtual DateTime EndOfTerm { get; set; }
public virtual Student Student { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
//类地图
public SettingMap()
{
/// Id(Reveal.Member<Setting>("StudentId")).GeneratedBy.Foreign("StudentId");
//Id(x => x.StudentId);
Map(x => x.TaskFilterOption).Default(DateFilters.All.ToString()).NvarcharWithMaxSize().Not.Nullable();
Map(x => x.TimeZoneId).NvarcharWithMaxSize().Not.Nullable();
Map(x => x.TimeZoneName).NvarcharWithMaxSize().Not.Nullable();
Map(x => x.EndOfTerm).Default("5/21/2011").Not.Nullable();
HasOne(x => x.Student);
}
Run Code Online (Sandbox Code Playgroud)
//学生地图
public class StudentMap : ClassMap<Student>
{
public StudentMap()
{
Id(x => x.StudentId);
HasOne(x => x.Setting).Cascade.All();
}
}
public class Student
{
public virtual Guid StudentId { get; private set; }
public virtual Setting Setting { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在,每当我尝试创建一个设置对象并将其保存到数据库时,它就会崩溃.
Setting setting = new Setting
{
TimeZoneId = viewModel.SelectedTimeZone,
TimeZoneName = info.DisplayName,
EndOfTerm = DateTime.UtcNow.AddDays(-1),
Student = student
};
The INSERT statement conflicted with the FOREIGN KEY constraint "FK_Settings_Students". The conflict occurred in database "Database", table "dbo.Students", column 'StudentId'.
The statement has been terminated.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.Data.SqlClient.SqlException: The INSERT statement conflicted with the FOREIGN KEY constraint "FK_Settings_Students". The conflict occurred in database "Database", table "dbo.Students", column 'StudentId'.
The statement has been terminated.
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
编辑
public class StudentMap : ClassMap<Student>
{
public StudentMap()
{
Id(x => x.StudentId).GeneratedBy.Guid();
HasOne(x => x.Setting).PropertyRef("Student").Cascade.All();
}
}
public class SettingMap : ClassMap<Setting>
{
public SettingMap()
{
Id(x => x.StudentId).GeneratedBy.Guid();
Map(x => x.TaskFilterOption).Default(DateFilters.All.ToString()).NvarcharWithMaxSize().Not.Nullable();
Map(x => x.TimeZoneId).NvarcharWithMaxSize().Not.Nullable();
Map(x => x.TimeZoneName).NvarcharWithMaxSize().Not.Nullable();
Map(x => x.EndOfTerm).Default("5/21/2011").Not.Nullable();
References(x => x.Student).Unique();
}
}
// try 1
Setting setting = new Setting
{
TimeZoneId = viewModel.SelectedTimeZone,
TimeZoneName = info.DisplayName,
EndOfTerm = DateTime.UtcNow.AddDays(-1),
Student = student
};
studentRepo.SaveSettings(setting);
studentRepo.Commit();
// try 2
Setting setting = new Setting
{
TimeZoneId = viewModel.SelectedTimeZone,
TimeZoneName = info.DisplayName,
EndOfTerm = DateTime.UtcNow.AddDays(-1),
Student = student
};
student.Setting = setting
studentRepo.CreateStudent(student);
studentRepo.Commit();
Run Code Online (Sandbox Code Playgroud)
我两种方式都有这些错误
Invalid index 5 for this SqlParameterCollection with Count=5. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.IndexOutOfRangeException: Invalid index 5 for this SqlParameterCollection with Count=5.
Source Error:
Line 76: using (ITransaction transaction = session.BeginTransaction()) Line 77: { Line 78: transaction.Commit(); Line 79: } Line 80: }
Run Code Online (Sandbox Code Playgroud)
Jak*_*art 38
如何在NH中映射双向一对一关联有两种基本方法.让我们说这些类看起来像这样:
public class Setting
{
public virtual Guid Id { get; set; }
public virtual Student Student { get; set; }
}
public class Student
{
public virtual Guid Id { get; set; }
public virtual Setting Setting { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
设置类是关联中的主("聚合根").这很不寻常,但这取决于问题领域......
主键关联
public SettingMap()
{
Id(x => x.Id).GeneratedBy.Guid();
HasOne(x => x.Student).Cascade.All();
}
public StudentMap()
{
Id(x => x.Id).GeneratedBy.Foreign("Setting");
HasOne(x => x.Setting).Constrained();
}
Run Code Online (Sandbox Code Playgroud)
并应存储一个新的设置实例:
var setting = new Setting();
setting.Student = new Student();
setting.Student.Name = "student1";
setting.Student.Setting = setting;
setting.Name = "setting1";
session.Save(setting);
Run Code Online (Sandbox Code Playgroud)
外键关联
public SettingMap()
{
Id(x => x.Id).GeneratedBy.Guid();
References(x => x.Student).Unique().Cascade.All();
}
public StudentMap()
{
Id(x => x.Id).GeneratedBy.Guid();
HasOne(x => x.Setting).Cascade.All().PropertyRef("Student");
}
Run Code Online (Sandbox Code Playgroud)
主键关联与您的解决方案很接近.只有当您完全确定关联始终是一对一时,才应使用主键关联.请注意,NH中的一对一不支持AllDeleteOrphan级联.
编辑:有关详细信息,请参阅:
http://fabiomaulo.blogspot.com/2010/03/conform-mapping-one-to-one.html
http://ayende.com/blog/3960/nhibernate-mapping-one-to-one
| 归档时间: |
|
| 查看次数: |
23084 次 |
| 最近记录: |