Linq to Sql - 创建数据库时未生成FK

时间:2011-03-28 02:17:18

标签: c# .net linq linq-to-sql

在使用DataContext.CreateDatabase()函数创建我的表时,是否可以帮助我了解表 Track 和table TrackArtist 之间的外键的原因数据库基于我的实体?我的表/列生成正常,但我的关系不是作为FK约束生成的。

我正在尝试在表之间创建一个FK,以便TrackArtist表可以成为Track表的“查找”表。

[Table(Name="Track")]
    public class Track
    {
        [Column (IsPrimaryKey=true, IsDbGenerated=true, AutoSync=AutoSync.OnInsert)]
        public int Id { get; set; }

        [Column]
        private int TrackArtistId {get; set;}

        private EntityRef<TrackArtist> _trackArtist;

        [Association(Name="FK_Track_TrackArtist", ThisKey = "TrackArtistId", OtherKey="Id", Storage = "_trackArtist")]
        public TrackArtist TrackArtist
        {
            get { return this._trackArtist.Entity; }
            set { this._trackArtist.Entity = value;
            TrackArtistId = value.Id;
            }
        }

        [Column (CanBeNull=false)] 
        public string Description { get; set; }  

    }

    [Table(Name="TrackArtist")]
    public class TrackArtist
    {
        [Column(IsPrimaryKey=true, IsDbGenerated=true, AutoSync=AutoSync.OnInsert)]
        internal int Id { get; set; }

        [Column (CanBeNull=false)]
        public string Name { get; set; }
    }

2 个答案:

答案 0 :(得分:0)

这可能不是你想要的,但值得一提。表键字段的命名约定。我建议使用TableNameId作为主键名。 TrackId,TrackArtistId。这样的命名约定也应该可以帮助你找到拼写错误,而这些拼写错误很少会产生神秘错误。此外,在“Id”的情况下,您通常会避免与内部和受保护关键字发生冲突。

答案 1 :(得分:0)

就像您的Id属性上ColumnAttribute的IsPrimaryKey属性为true一样,ColumnAttribute的IsForeignKey属性在您的TrackArtist属性上必须为true。

请在此处查看ColumnAttribute.IsForeignKey的MSDN文档:http://msdn.microsoft.com/en-us/library/system.data.linq.mapping.associationattribute.isforeignkey.aspx