根本原因:EF無法將可空值字段推斷爲主鍵。
EF 無法推斷出主鍵,因爲推斷的主鍵字段,在視圖中都爲null,而EF無法將可空值字段推斷爲主鍵。
解決方案:
sqlservr中使用ISNULL字段,讓主鍵字段必須不爲空;
案例:
1利用已有唯一鍵
ISNULL(T_Habitat.PointBatchID,'0000')
ISNULL(LEFT(dbo.T_Habitat.PointBatchID,4),'0000')
2、自己創建唯一鍵
ISNULL(newid(), '00000000-0000-0000-0000-000000000000')as ID,
結果:
思路來源:
1 、https://bbs.csdn.net/topics/391921659
有句話:我自己已經解決了,我通過打開XML編輯器打開了之後,看到沒有生成一張表被註釋了,然後按照註釋修改了。
<!--生成過程中發現錯誤:
警告 6002: 表/視圖“WaterEco.dbo.V_HabitAverage”未定義主鍵。已推斷出該鍵,並將定義創建爲只讀的表/視圖。-->
<EntityType Name="V_HabitAverage">
<Property Name="PointBatchIDLeft" Type="nvarchar" MaxLength="4" Nullable="false" />
<Property Name="ID" Type="uniqueidentifier" />
</EntityType>
-->
修改視圖後,生成的XML是:
<!--生成過程中發現錯誤:
警告 6002: 表/視圖“WaterEco.dbo.V_HabitAverage”未定義主鍵。已推斷出該鍵,並將定義創建爲只讀的表/視圖。-->
<EntityType Name="V_HabitAverage">
<Key>
<PropertyRef Name="PointBatchIDLeft" />
</Key>
<Property Name="PointBatchIDLeft" Type="nvarchar" MaxLength="4" Nullable="false" />
<Property Name="ID" Type="uniqueidentifier" />
</EntityType>
你也可以直接修改XML來改正這個錯誤,當時這可能導致數據庫與數據模型不一致,
下次如果數據庫視圖又有改動,更新視圖時可能還會報錯,因爲生成的XML被覆蓋了。
所以建議修改數據庫視圖。
2、https://bbs.csdn.net/topics/390911105