亚音速主键问题

本文关键字:问题 亚音速 | 更新日期: 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);