实体框架 - 种子数据库 - PK需要包含在种子方法中吗?

时间:2013-02-03 23:34:47

标签: c# entity-framework ef-code-first ef-migrations seeding

MVC Music Store教程之后,数据库将附带样本数据。 Album类如下:

namespace MvcMusicStore.Models
{
    public class Album
    {
        public int      AlbumId     { get; set;}
        // ...
    }
}

然后在本教程中使用的示例数据类中,在Album方法中创建Seed()对象:

new Album { Title = "The Best Of Billy Cobham", 
Genre = genres.Single(g => g.Name == "Jazz"), 
Price = 8.99M, Artist = artists.Single(a => a.Name == "Billy Cobham"), 
AlbumArtUrl = "/Content/Images/placeholder.gif" }

我的项目中,我有一个班级Tenant

public class Tenant
{
    [key]
    public int      TenantId     { get; set;}
    // ...
}

在我的Seed()方法中,我创建了一个这样的租户:

new Tenant { UserId=1,  UserName="Matthew" /*...*/ }

在我的Seed()方法中,我包含了Tenant PK,即UserId - 租户来自用户。我想知道,因为在Seed()方法中我明确地说租户的UserId的PK是1,这会在方法运行时引起问题吗?我问,因为在音乐商店教程中,作者没有收录专辑的PK。

因此在创建相册时未明确说明PK。 EF默认会应用PK吗?我花了一段时间为我自己的项目创建了大量的样本数据,并且我已经手动将很多实体放入PK中 - EF会接受这个还是会导致我出现问题?播种是生成样本数据的最佳方式 - 替代方案吗?

1 个答案:

答案 0 :(得分:2)

当您不添加[Key]属性时,EF将尝试查找名为Id<yourClassName>Id的int可读 - 可写属性。

这就是全部。这就是为什么AlbumId被当作类Album的PK的原因:该类中没有关键属性,AlbumId = <nameOfClass>Id,它是一个可读写的int。

如果您设置了Key属性,EF将不会尝试找到另一个属性。这只是一个惯例,让你不那么冗长。

对于示例数据,Seed()方法的正文是将它们放入Code First的好方法。