C# 模型中引用同一表的两个外键
如果一个模型中有两个属性引用另一个表作为外键,那么我似乎有问题。引擎意外地为它们指定了奇怪的列名,结果我得到了一个SQL错误。让我展示一下我的源代码C# 模型中引用同一表的两个外键,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,如果一个模型中有两个属性引用另一个表作为外键,那么我似乎有问题。引擎意外地为它们指定了奇怪的列名,结果我得到了一个SQL错误。让我展示一下我的源代码 create table Units ( UnitID int identity constraint PK_Units primary key, AspNetUserID nvarchar(128) not null constraint FK_Units_AspNetUserId refere
create table Units
(
UnitID int identity
constraint PK_Units primary key,
AspNetUserID nvarchar(128) not null
constraint FK_Units_AspNetUserId references AspNetUsers(Id),
[Name] nvarchar(255) not null
);
create unique index UIX_Units_AspNetUserID_Name
on Units(AspNetUserID, [Name]);
create table Products
(
ProductID int identity
constraint PK_Products primary key,
BusinessID int not null
constraint FK_Products_BusinessID references Businesses(BusinessID),
SKU nvarchar(31) null,
[Name] nvarchar(255) not null,
AdditionalName nvarchar(255) null,
UnitID int not null
constraint FK_Products_UnitID references Units(UnitID),
UnitPrice decimal(12, 2) not null,
TareUnitID int null
constraint FK_Products_TareUnitID references Units(UnitID),
UnitsInTare decimal(12, 2) null,
DefTaxRateID int null
constraint FK_Products_DefTaxRateID references TaxRates(TaxRateID)
);
create unique index UIX_Products_BusinessID_SKU_Name
on Products(BusinessID, SKU, [Name]);
VS引擎生成的模型。如您所见,Products
表两次引用了Units
表(UnitID
和TareunitID
)
最后,我有以下元数据类
public class UnitMetadata
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int UnitID { get; set; }
[Required(ErrorMessageResourceType = typeof(GlobalRes), ErrorMessageResourceName = "ThisFieldIsRequired")]
[StringLength(128, MinimumLength = 1, ErrorMessageResourceType = typeof(GlobalRes), ErrorMessageResourceName = "MustBeMax128Characters")]
public string AspNetUserID { get; set; }
[Required(ErrorMessageResourceType = typeof(GlobalRes), ErrorMessageResourceName = "ThisFieldIsRequired")]
[StringLength(255, MinimumLength = 1, ErrorMessageResourceType = typeof(GlobalRes), ErrorMessageResourceName = "MustBeMax255Characters")]
[Display(Name = "Name", ResourceType = typeof(GlobalRes))]
public string Name { get; set; }
public virtual ICollection<Product> Products { get; set; }
public virtual ICollection<Product> Products1 { get; set; }
}
public class ProductMetadata
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ProductID { get; set; }
[Required(ErrorMessageResourceType = typeof(GlobalRes), ErrorMessageResourceName = "ThisFieldIsRequired")]
public int BusinessID { get; set; }
[StringLength(31, ErrorMessageResourceType = typeof(GlobalRes), ErrorMessageResourceName = "MustBeMax31Characters")]
[Display(Name = "UID", ResourceType = typeof(GlobalRes))]
public string SKU { get; set; }
[Required(ErrorMessageResourceType = typeof(GlobalRes), ErrorMessageResourceName = "ThisFieldIsRequired")]
[StringLength(255, MinimumLength = 1, ErrorMessageResourceType = typeof(GlobalRes), ErrorMessageResourceName = "MustBeMax255Characters")]
[Display(Name = "Name", ResourceType = typeof(GlobalRes))]
public string Name { get; set; }
[StringLength(255, MinimumLength = 1, ErrorMessageResourceType = typeof(GlobalRes), ErrorMessageResourceName = "MustBeMax255Characters")]
[Display(Name = "AdditionalName", ResourceType = typeof(GlobalRes))]
public string AdditionalName { get; set; }
[ForeignKey("Unit")]
public int UnitID { get; set; }
[Required(ErrorMessageResourceType = typeof(GlobalRes), ErrorMessageResourceName = "ThisFieldIsRequired")]
[Display(Name = "UnitPrice", ResourceType = typeof(GlobalRes))]
public decimal UnitPrice { get; set; }
[ForeignKey("Unit1")]
public Nullable<int> TareUnitID { get; set; }
[Display(Name = "UnitsInTare", ResourceType = typeof(GlobalRes))]
public Nullable<decimal> UnitsInTare { get; set; }
[ForeignKey("TaxRate")]
[Display(Name = "DefTaxRateID", ResourceType = typeof(GlobalRes))]
public Nullable<int> DefTaxRateID { get; set; }
public virtual Business Business { get; set; }
public virtual TaxRate TaxRate { get; set; }
[ForeignKey("UnitID")]
public virtual Unit Unit { get; set; }
[ForeignKey("TareUnitID")]
public virtual Unit Unit1 { get; set; }
public virtual ICollection<InvoiceItem> InvoiceItems { get; set; }
}
问题是,如何让它正常工作?为什么要将这些列放到查询中?请注意
TareUnitID int null
constraint FK_Products_TareUnitID references Units(UnitID),
工作正常,没问题。我只对引用了两次的单元有问题。“由VS引擎生成”-您能否准确解释这是什么以及您使用的EF引擎?刚刚在模型图上选择了“从数据库更新模型”。使用VS 2017。
public class UnitMetadata
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int UnitID { get; set; }
[Required(ErrorMessageResourceType = typeof(GlobalRes), ErrorMessageResourceName = "ThisFieldIsRequired")]
[StringLength(128, MinimumLength = 1, ErrorMessageResourceType = typeof(GlobalRes), ErrorMessageResourceName = "MustBeMax128Characters")]
public string AspNetUserID { get; set; }
[Required(ErrorMessageResourceType = typeof(GlobalRes), ErrorMessageResourceName = "ThisFieldIsRequired")]
[StringLength(255, MinimumLength = 1, ErrorMessageResourceType = typeof(GlobalRes), ErrorMessageResourceName = "MustBeMax255Characters")]
[Display(Name = "Name", ResourceType = typeof(GlobalRes))]
public string Name { get; set; }
public virtual ICollection<Product> Products { get; set; }
public virtual ICollection<Product> Products1 { get; set; }
}
public class ProductMetadata
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ProductID { get; set; }
[Required(ErrorMessageResourceType = typeof(GlobalRes), ErrorMessageResourceName = "ThisFieldIsRequired")]
public int BusinessID { get; set; }
[StringLength(31, ErrorMessageResourceType = typeof(GlobalRes), ErrorMessageResourceName = "MustBeMax31Characters")]
[Display(Name = "UID", ResourceType = typeof(GlobalRes))]
public string SKU { get; set; }
[Required(ErrorMessageResourceType = typeof(GlobalRes), ErrorMessageResourceName = "ThisFieldIsRequired")]
[StringLength(255, MinimumLength = 1, ErrorMessageResourceType = typeof(GlobalRes), ErrorMessageResourceName = "MustBeMax255Characters")]
[Display(Name = "Name", ResourceType = typeof(GlobalRes))]
public string Name { get; set; }
[StringLength(255, MinimumLength = 1, ErrorMessageResourceType = typeof(GlobalRes), ErrorMessageResourceName = "MustBeMax255Characters")]
[Display(Name = "AdditionalName", ResourceType = typeof(GlobalRes))]
public string AdditionalName { get; set; }
[ForeignKey("Unit")]
public int UnitID { get; set; }
[Required(ErrorMessageResourceType = typeof(GlobalRes), ErrorMessageResourceName = "ThisFieldIsRequired")]
[Display(Name = "UnitPrice", ResourceType = typeof(GlobalRes))]
public decimal UnitPrice { get; set; }
[ForeignKey("Unit1")]
public Nullable<int> TareUnitID { get; set; }
[Display(Name = "UnitsInTare", ResourceType = typeof(GlobalRes))]
public Nullable<decimal> UnitsInTare { get; set; }
[ForeignKey("TaxRate")]
[Display(Name = "DefTaxRateID", ResourceType = typeof(GlobalRes))]
public Nullable<int> DefTaxRateID { get; set; }
public virtual Business Business { get; set; }
public virtual TaxRate TaxRate { get; set; }
[ForeignKey("UnitID")]
public virtual Unit Unit { get; set; }
[ForeignKey("TareUnitID")]
public virtual Unit Unit1 { get; set; }
public virtual ICollection<InvoiceItem> InvoiceItems { get; set; }
}
SELECT
[Extent1].[ProductID] AS [ProductID],
[Extent1].[BusinessID] AS [BusinessID],
[Extent1].[SKU] AS [SKU],
[Extent1].[Name] AS [Name],
[Extent1].[AdditionalName] AS [AdditionalName],
[Extent1].[UnitID] AS [UnitID],
[Extent1].[UnitPrice] AS [UnitPrice],
[Extent1].[TareUnitID] AS [TareUnitID],
[Extent1].[UnitsInTare] AS [UnitsInTare],
[Extent1].[DefTaxRateID] AS [DefTaxRateID],
[Extent1].[Unit_UnitID] AS [Unit_UnitID],
[Extent1].[Unit_UnitID1] AS [Unit_UnitID1]
FROM
[dbo].[Products] AS [Extent1]
ORDER BY
ROW_NUMBER() OVER (ORDER BY [Extent1].[Name] ASC)
OFFSET 0 ROWS FETCH NEXT 20 ROWS ONLY
TareUnitID int null
constraint FK_Products_TareUnitID references Units(UnitID),