2016-03-07 36 views
-1

我想要連接在一個id(實數列)和註釋類型(字符串)上。以下示例不起作用,但應表明我的意圖。是否有可能在實體框架中有一個常量字符串作爲外鍵

public class Something 
{ 
    [Key] 
    [Column(Order=1)] 
    public long Id { get; set; } 

    [Key] 
    [Column(Order = 2)] 
    // Does this have to be in the database? 
    public string CommentType = "Something-type-comment"; 

    [ForeignKey("CommentRecordId,CommentType")] 
    public Comment Comment { get; set; } 
} 

public class Comment 
{ 
    [Key] 
    [Column(Order=1)] 
    public long CommentRecordId { get; set; } 

    [Key] 
    [Column(Order=2)] 
    public string CommentType { get; set; } 
} 

當這個被轉換爲SQL我想它翻譯成類似於下面的東西。

SELECT * from Something s 
    JOIN Comment c ON 
     s.Id = c.CommentRecordId 
      and 
     c.CommentType = 'Something-type-comment'; --there is no corresponding field in Something table 

編輯: 另外順便說一下,當我嘗試這樣說,我得到了下面的錯誤。 「 」關係約束中的相關和主體角色中的屬性數量必須相同。「

+1

問題是什麼?請閱讀http://stackoverflow.com/help/how-to-ask –

+0

標題是問題。 「在實體框架中是否有可能將字符串作爲外鍵?」 – matthewdaniel

+0

此外,屬性CommentType上面的註釋應顯示在示例中我要求的內容 – matthewdaniel

回答

0

我不相信有辦法做你想做的事AND使它成爲一個外鍵。 SQL中沒有構造允許將常數值作爲外鍵的一部分。您可以使用計算列,CHECK約束或觸發器等其他結構來確保基礎數據數據是「常量」,但外鍵必須引用表列。但是,這些方法不能使用我知道的代碼,因此您必須在數據庫級別配置這些方法。

如果你必須有一個外鍵,那麼我會建議在數據庫中保留這個列,並使它成爲一個真正的外鍵,也許使用業務規則或上述方法之一。

第二個選項是刪除外鍵屬性,並通過業務規則強制執行關係(以及常量值)。 (即將常量值嵌入到存儲庫查詢中,以便生成您指定的等效SQL)。

喜歡的東西

var query = from s in Something 
      join c in Comment 
      on new {s.Id, CommentType = "Something-type-comment"} equals 
       new {c.CommentRecordId, c.CommentType} 
      select new {s, c} 

var query = from s in Something 
      join c in Comment 
      on s.Id equals c.CommentRecordId 
      where c.CommentType == "Something-type-comment" 
      select new {s, c} 
+0

你可以詳細說明第二個選項嗎? – matthewdaniel

+0

@matthewdaniel我用幾個選項更新了這個問題 –

相關問題