在实体框架中是否可以将常量字符串作为外键

时间:2016-03-07 14:58:15

标签: c# asp.net entity-framework

我希望连接位于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 个答案:

答案 0 :(得分:0)

我不相信有办法做你想要的事情使它成为外键。 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}