为什么EntityFrameWork要在我的表中添加额外的列



所以我有一个Db,它有两个带有模式的表:

CREATE TABLE Portfolios (
Id INTEGER NOT NULL PRIMARY KEY,
CurrentTotalValue FLOAT NOT NULL DEFAULT 0
);
CREATE TABLE Stocks (
Id INTEGER NOT NULL PRIMARY KEY, 
Portfolio_id INTEGER NOT NULL,
Ticker VARCHAR(20) NOT NULL,
BaseCurrency VARCHAR(5) NOT NULL,
NumberOfShares INTEGER NOT NULL,
CONSTRAINT fk_stocks_portfolios 
FOREIGN KEY(Portfolio_id) REFERENCES portfolios(Id)
);

以及两个Db模型:

public class Portfolio
{
[Required]
public int Id { get; set; }
[Required]
public double CurrentTotalValue { get; set; } = 0;
[Required]
public bool IsDeleted { get; set; } = false;
public ICollection<Stock> Stocks { get; set; }
}
public class Stock
{
[Required]
public int Id { get; set; }
[Required]
public int Portfolio_id { get; set; }
[Required]
public string Ticker { get; set; }
[Required]
public string BaseCurrency { get; set; }
[Required]
public int NumberOfShares { get; set; }
}

现在,每次我尝试获取投资组合时,都会收到以下错误消息:"迭代上下文类型的查询结果时发生异常

'PortfolioService.DataAcess.CurrencyDbContext'.
Microsoft.Data.SqlClient.SqlException (0x80131904): Invalid column name 'PortfolioId'."

我甚至没有一个名为";PortfolioId";我有";Portfolio_Id";。我还注意到,就在这个错误消息的上方,EF似乎正在向查询中插入额外的列,如下所示:

SELECT [s].[Id], [s].[BaseCurrency], [s].[NumberOfShares], [s].[PortfolioId], [s].[Portfolio_id], [s].[Ticker]
FROM [Stocks] AS [s]
WHERE [s].[Portfolio_id] = @__id_0

现在我的问题是,它为什么会这样做,我该如何修复它?

EF的惯例很可能没有识别"_Id";您用作FK的命名约定。您已经在Portfolio和Stocks之间指定了一对多,EF希望在Stock实体上找到一个返回到Portfolio的FK。

如果Stock上有导航属性,您很可能必须明确设置FK属性以使用:

public int Portfolio_Id { get; set; }
[ForeignKey(nameof(Portfolio_Id))]
public virtual Portfolio Portfolio { get; set; }

由于您没有导航属性,我们需要告诉EF FK要使用什么属性。这可以在OnModelCreating中完成,也可以通过EntityTypeConfiguration:完成

modelBuilder.Entity<Portfolio>()
.HasMany(p => p.Stocks)
.WithRequired()
.HasForeignKey(s => s.Portfolio_Id);

最新更新