gpt4 book ai didi

c# - Fluent nhibernate 一对一映射

转载 作者:IT王子 更新时间:2023-10-29 04:29:55 24 4
gpt4 key购买 nike

如何进行一对一映射。

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; }
}

设置类图:

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);
}

学生类(class)图

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; }
}

现在每次我尝试创建一个设置对象并将其保存到数据库时它都会崩溃。

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.

我错过了什么?

编辑

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();
}
}

Setting setting = new Setting 
{
TimeZoneId = viewModel.SelectedTimeZone,
TimeZoneName = info.DisplayName,
EndOfTerm = DateTime.UtcNow.AddDays(-1),
Student = student
};

studentRepo.SaveSettings(setting);
studentRepo.Commit();

两种方式我都得到这些错误

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: }

最佳答案

在 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; }
}

设置类是关联中的主控(“聚合根”)。这很不寻常,但它取决于问题域......

主键关联

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();
}

并且应该存储一个新的设置实例:

        var setting = new Setting();

setting.Student = new Student();
setting.Student.Name = "student1";
setting.Student.Setting = setting;
setting.Name = "setting1";

session.Save(setting);

外键关联

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");
}

主键关联接近您的解决方案。仅当您绝对确定关联始终是一对一时,才应使用主键关联。请注意,NH 中的一对一不支持 AllDeleteOrphan 级联。

编辑:有关更多详细信息,请参阅:

http://fabiomaulo.blogspot.com/2010/03/conform-mapping-one-to-one.html

http://ayende.com/blog/3960/nhibernate-mapping-one-to-one

关于c# - Fluent nhibernate 一对一映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6085568/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com