gpt4 book ai didi

c# - Fluent Nhibernate 错误外键

转载 作者:行者123 更新时间:2023-11-30 16:41:12 25 4
gpt4 key购买 nike

我知道这个问题有一些关于它的问题,但我找不到正确的答案,所以请让我问这个问题,看看是否有人能给我正确的答案

我的数据库有以下方案(简化表以关注问题)

Table Project
idProject INT PK
projectName string UNIQUE
numOfItems INT

Table Item
serialNumber integer PK
idProject integer PK, FK (references idProject table Project)
fileName string PK

Table Analysis
serialNumber integer PK, FK (references serialNumber table Item)
dateMeasure Date PK
fileName string PK

我将这些表用 C# 编码如下

class Analysis{
public virtual Item serialNum{ get; set; }
public virtual DateTime dateMeasure { get; set; }
public virtual string fileName { get; set; }

public override int GetHashCode(){
return (fileName.GetHashCode() * serialNum.GetHashCode() * dateMeasure.GetHashCode());
}

public override bool Equals(object obj){
if (obj == null || obj.GetType() != GetType()) return false;

Analysis a = (Analysis)obj;

return (a.serialNum == serialNum && a.fileName == fileName && a.dateMeasure == dateMeasure);
}
}

class Item{
public virtual int serialNumber { get; set; }
public virtual Proyecto idProject { get; set; }
public virtual string fileName { get; set; }
public virtual DateTime measureDate { get; set; }

public override int GetHashCode(){
return (fileName.GetHashCode() * serialNumber.GetHashCode() * idProject.GetHashCode());
}

public override bool Equals(object obj)
{
if (obj == null || obj.GetType() != GetType()) return false;

Item i = (Item)obj;

return (i.serialNumber == serialNumber&& i.fileName== fileName&& d.idProject == idProject);
}
}

class Project
{
public virtual int idProject { get; set; }
public virtual string projectName{ get; set; }
public virtual int numItems { get; set; }
}

以及以下实体的映射

class AnalysisMap: ClassMap<Analysis>
{

public AnalysisMap()
{
CompositeId()
.KeyReference(x=> x.serialNumber)
.KeyProperty(x => x.dateMeasure)
.KeyProperty(x => x.fileName);
}
}

class ItemMap : ClassMap<Item>
{
public ItemMap()
{
CompositeId()
.KeyProperty(x => x.fileName)
.KeyReference(x => x.idProject)
.KeyProperty(x => x.serialNumber);
Map (x=>x.measureDate).Column("dateMeasure").Not.Nullable();
References(x => x.idProject).Column("idProject");
}
}

class ProjectMap : ClassMap<Project>
{
public ProjectMap()
{
Id(x => x.idProject).GeneratedBy.Identity().Column("idProject");
Map(x => x.projectName).Column("projectName").Unique();
Map(x => x.NumItems).Column("numOfItems").Not.Nullable().Default("0");
}
}

因此,当我尝试使用以下代码打开 session 时,出现错误 “外键 (FK9CF1483E7BAABE07:Analysis [serialNum])) 必须与引用的主键 (Item [fileName, idProject, 序列号])”

try{
ISessionFactory sf = Fluently.Configure()
.Database(SQLiteConfiguration.Standard.InMemory().ShowSql()
.ConnectionString("server=local;Data Source= data_source;Integrated Security=SSPI;"))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Project>()
.AddFromAssemblyOf<Item>()
.AddFromAssemblyOf<Analysis>()).BuildSessionFactory();

ISession session = sf.OpenSession();
lblStatus.Text = "OK";
}
catch (Exception ex){
lblStatus.Text = ex.Message.ToString();
}

那么我应该如何获取映射才能使其正常工作?

最佳答案

首先你必须理解错误,你说:

Table Analysis serialNumber integer PK, FK (references serialNumber table Item)

这是错误的,serial number 是引用serialNumber、idProject 和filename 的FK,因为这三个一起构成表Item PK。这就是为什么错误说“......必须具有与引用的主键相同的列数(Item [fileName,idProject,serialNumber])”,表 Item 的主键由三个字段组成,而不仅仅是由“serialNumber”组成"正如您所建议的那样。

看看这个link ,它解释了如何配置复合外键,这就是您所需要的。

如果您需要任何帮助,请在下方评论。

关于c# - Fluent Nhibernate 错误外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49735958/

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