C# 亚音速主键问题

C# 亚音速主键问题,c#,subsonic,C#,Subsonic,在我们的组织中,我们必须在表中的主键上使用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]

在我们的组织中,我们必须在表中的主键上使用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]
这是我的问题,实际上有两个

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

注意IsPrimaryKey=true-Hmm

从我收集的资料来看,亚音速有助于将您的类(可能生成它们?)与数据库连接起来。根据报告:

主键

如果您想使用亚音速来访问 您的表,您需要有一个主 为表定义的键。这是 在任何情况下都有良好的实践,我们 需要它来和你的朋友做某些事情吗 桌子如果你没有主键 定义后,您的类将不会 生成

因此,假设您已经在表结构上定义了主键,但它仍然不起作用,那么我们需要找到其他东西来告诉它要查找什么。这一页还说:

主键

如果您调用列“ID”或“Key”或 “[ClassName]ID”-无论类型如何 –这将是您的主键。如果 你还可以考虑其他事情 使用主键属性 [SubSonicPrimaryKey]包含在 SubSonic.SqlGeneration.Schema 命名空间,我们将使用该列

这里的关键是,您必须通过添加
[SubSonicPrimaryKey]
属性来明确地告诉它使用哪个列(类属性/字段)作为主键。要做到这一点,请进入类文件(我想无论
vndMapping
是什么类型),并在
VENDOR\u ID
属性声明上方添加
[subsecprimarykey]

例如,类似这样的事情:

class VendorMap {
    [SubSonicPrimaryKey]
    public int VENDOR_ID { get; set; }
}
[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);
请注意,我不使用亚音速,但从他们的网站上说,这似乎是有道理的

编辑
根据您的编辑,尝试替换
Columns.Add(newdatabasecolumn(“ID_NO”,this){/*…*/})使用类似以下内容:

class VendorMap {
    [SubSonicPrimaryKey]
    public int VENDOR_ID { get; set; }
}
[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);

一个问题是,您必须将
subsecprimarykey
属性应用于模型对象中主键的属性,该属性是由代码生成的

所以你不能像Drackir展示的那样手动把它放在那里。下一次生成模板时,更改将被吹走,并且您不能在分部类中应用该属性,因为该字段已经定义

您将不得不更改模板(另外,也许您应该更新到所有内容的最新版本,structs.cs文件中注释掉的代码显示您有一些不匹配和过时的内容)

有几种方法可以更改模板以使其正常工作。最简单的方法可能是告诉模板完全忽略
ID\u NO
字段,然后在部分类中手动定义它们。另一个选项是让模板在生成属性时将属性添加到相应的字段中


事实上,尽管如此,每次我回答一个亚音速的问题——而且随着时间的推移,我一直在想,“我应该告诉他们尽可能远离亚音速。”它有很多这样的陷阱,而且它真的没有发展到任何实质性的程度。我可能会因为这样说而感到厌恶,但我知道几个月前我们决定在所有项目上尽可能远离它。

您使用的是哪个亚音速版本和哪个模板?我更新了我的答案。看看这是否有帮助。我正在寻找亚音速快速设置/开始。。。但在其他方面都是皮塔。我直接使用源代码,他们的“todo”“hack”注释的数量会让我保持清醒。@IanQuigley如果你有任何选择,我强烈建议不要使用亚音速。拿起一个微型ORM,比如PetaPoco(或Npco,基于它的)或Dapper。我们在亚音速方面遇到了太多问题,这简直是办公室的笑话。事实上,Mindscape的Lightspeed已经取得了很大的成功,尽管它需要付费许可才能使用8个实体类以外的类。我最近开发了一个小型实用数据移动应用程序,并使用了PetaPoco,但还没完成一半,我就哀叹不仅仅是使用Lightspeed,因为它比微型orm更快更简单,imho。谢谢。已经切换到NHibernate了。也只花了几个小时。