亚音速主键问题
本文关键字:问题 亚音速 | 更新日期: 2023-09-27 17:53:26
在我们的组织中,我们必须使用名称ID_NO为我们表中的主键,对我来说有点奇怪,但我不能改变这一点,但是它导致亚音速抱怨,我希望有更多经验的人可以帮助我。
这是我得到的错误
Can't decide which property to consider the Key - you can create one called 'ID' or mark one with SubSonicPrimaryKey attribute [System.InvalidOperationException]
这是我的查询(s)实际上有两个。
var excludedVendors = (from vndMapping in db.COMPANIES_VND_MAPPINGS
join compView in db.COMPANIES_COMPANIES_VS on vndMapping.VENDOR_ID equals compView.COMPANY_ID
join cmpTier in db.CT_CT_CMP_TIERS on compView.TIER_CODE equals cmpTier.CODE
where (vndMapping.OEM_ID == null || vndMapping.OEM_ID == oemId)
&& (vndMapping.MODEL_ID == null || vndMapping.MODEL_ID == modelId)
&& (vndMapping.MODALITY_ID == null || vndMapping.MODALITY_ID == modalityId)
&& (vndMapping.CLASS_ID == null || vndMapping.CLASS_ID == productTypeId)
&& vndMapping.EXCLUDE == null
select
vndMapping.VENDOR_ID
);
possibleVendors = (from vndMapping in db.COMPANIES_VND_MAPPINGS
join compView in db.COMPANIES_COMPANIES_VS on vndMapping.VENDOR_ID equals compView.COMPANY_ID
join cmpTier in db.CT_CT_CMP_TIERS on compView.TIER_CODE equals cmpTier.CODE
where (vndMapping.OEM_ID == null || vndMapping.OEM_ID == oemId)
&& (vndMapping.MODEL_ID == null || vndMapping.MODEL_ID == modelId)
&& (vndMapping.MODALITY_ID == null || vndMapping.MODALITY_ID == modalityId)
&& (vndMapping.CLASS_ID == null || vndMapping.CLASS_ID == productTypeId)
&& !excludedVendors.Any(x => x == vndMapping.VENDOR_ID)
&& (compView.COMPANY_TYPE_ID == 2 || compView.COMPANY_TYPE_ID == 3)
select new VendorProxy
{
DiscountPercent = (double)compView.DISCOUNT_PERCENT,
OrderNo = cmpTier.ORDER_NO,
PhoneNumber = "",
TierCode = cmpTier.CODE,
TierDescription = cmpTier.DESCRIPTION,
VendorId = vndMapping.VENDOR_ID,
VendorName = compView.COMPANY_NAME
}).OrderBy(x => x.OrderNo).ThenBy(x => x.VendorName).ToList<VendorProxy>();
直到我添加了&& !excludedVendors.Any(x => x == vndMapping.VENDOR_ID)
,我得到了这个问题,我似乎无法弄清楚如何解决它,虽然,我想我会去亚音速的网站,并在两秒钟内找到答案,当然这不会发生。
感谢您的任何输入…
我使用的是3.0.0.3版本,我只是在我们通过t4生成的structs文件中发现了这个
public class COMPANIES_VND_MAPPINGTable: DatabaseTable {
public COMPANIES_VND_MAPPINGTable(IDataProvider provider):base("VND_MAPPINGS",provider){
ClassName = "COMPANIES_VND_MAPPING";
SchemaName = "COMPANIES";
Columns.Add(new DatabaseColumn("ID_NO", this)
{
IsPrimaryKey = true,
DataType = DbType.Decimal,
IsNullable = false,
AutoIncrement = false,
IsForeignKey = false,
MaxLength = 15
//CleanName = "ID_NO" Temporarily removed. The 'CleanName' property does not exist on this class in the SubSonic3 master repo on GitHub. Did someone miss a file checkin?
});
Columns.Add(new DatabaseColumn("VENDOR_ID", this)
{
IsPrimaryKey = false,
DataType = DbType.Decimal,
IsNullable = false,
AutoIncrement = false,
IsForeignKey = false,
MaxLength = 15
//CleanName = "VENDOR_ID" Temporarily removed. The 'CleanName' property does not exist on this class in the SubSonic3 master repo on GitHub. Did someone miss a file checkin?
});
注意IsPrimaryKey = true -嗯?
一个问题是,您必须将SubSonicPrimaryKey
属性应用于模型对象(生成的代码)中主键的属性。
所以你不能像Drackir展示的那样手动把它放在那里。下次生成模板时,这些更改就会消失,你就不能在部分类中应用该属性了,因为该字段已经定义了。
你将不得不改变模板(也,也许你应该更新到最新版本的一切,从你的structs.cs文件注释掉的代码显示你有一些东西不匹配和过时)。
有几种方法可以更改模板以使其工作。最简单的可能是告诉模板完全忽略ID_NO
字段,然后在部分类中手动定义它们。另一种选择是让模板在生成属性时将属性添加到相应的字段中。
真的,虽然,每次我回答一个亚音速的问题-随着时间的推移越来越多-我一直在想,"我应该告诉他们在他们可以的时候远离亚音速。"它有很多这样的陷阱,而且它真的没有得到任何实质性的发展。我这么说可能会招致一些人的反感,但我知道我们几个月前就决定在所有项目中尽可能地远离它。
从我收集到的信息来看,SubSonic可以帮助连接你的类(也许生成它们?)和你的数据库。根据公约文件:
主键如果你想使用亚音速访问你的表,你需要有一个Primary为表定义的键。这是在任何情况下都是好的做法,我们需要用它来做一些事情表格如果没有主键定义后,您的类将不会定义生成。
所以,假设你已经在你的表结构上定义了一个主键,但它仍然不起作用,我们需要找到其他东西来告诉它要查找什么。该页面还继续说:
主键如果您将列称为" ID "或" Key "或"[ClassName]ID"-无论它的类型-这将是你的主键。如果你心里还有别的事可以做使用主键属性参数中包含的[SubSonicPrimaryKeySubSonic.SqlGeneration.Schema命名空间,我们将使用该列
这里的关键是,您必须通过添加[SubSonicPrimaryKey]
属性显式地告诉它使用哪个列(类属性/字段)作为主键。要做到这一点,进入您的类文件(我猜无论vndMapping
类型是什么),并在VENDOR_ID
属性声明之上添加[SubSonicPrimaryKey]
。
例如,像这样:
class VendorMap {
[SubSonicPrimaryKey]
public int VENDOR_ID { get; set; }
}
请注意,我不使用亚音速,但从他们的网站上说,这似乎是有道理的。
编辑
根据您的编辑,尝试用以下内容替换Columns.Add(new DatabaseColumn("ID_NO", this) { /*...*/ });
:
[SubSonicPrimaryKey]
DatabaseColumn idcol = new DatabaseColumn("ID_NO", this)
{
IsPrimaryKey = true,
DataType = DbType.Decimal,
IsNullable = false,
AutoIncrement = false,
IsForeignKey = false,
MaxLength = 15
//CleanName = "ID_NO" Temporarily removed. The 'CleanName' property does not exist on this class in the SubSonic3 master repo on GitHub. Did someone miss a file checkin?
};
Columns.Add(idcol);