【问题标题】:Entity Framework - seeding database - does PK need to be included in Seed method?实体框架 - 种子数据库 - PK 是否需要包含在种子方法中?
【发布时间】:2013-01-18 16:10:21
【问题描述】:

按照MVC Music Store 教程,数据库中植入了示例数据。 Album 类如下:

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

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

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() 方法中,我包含了租户 PK,即 UserId - 租户派生自用户。我想知道,因为在 Seed() 方法中我已经明确表示租户的 UserId PK 为 1,所以在方法运行时会导致问题吗?我问是因为在音乐商店教程中,作者没有包含专辑的PK。

所以创建专辑时没有明确说明 PK。 EF会默认应用PK吗?我刚刚花了一段时间为我自己的项目创建了很多示例数据,并且我已经手动将很多实体的 PK 放入 - EF 会接受这个还是会给我带来问题?播种是生成样本数据的最佳方式 - 替代方案吗?

【问题讨论】:

  • EF 将在您每次添加并将更改保存到 db afaik 时创建一个适当的 PK。在调用 SaveChanges 之前,添加的模型不会反映 PK
  • 并非所有映射到表的类的 PK 都用 [key] 注释并且类型为 int

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


【解决方案1】:

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

就是这样。这就是为什么将 AlbumId 作为类 Album 的 PK 的原因:该类中不存在关键属性, AlbumId = <nameOfClass>Id,它是一个可读可写的 int。

如果您设置了 Key 属性,EF 将不会尝试查找另一个。这只是一个约定,可以让您不那么冗长。

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

【讨论】:

  • 刚刚看到你的编辑,所以在 Seed() 方法中设置 key 属性不会有问题吗?
  • 对不起,我的错,应该在 TenantId 上...!
  • 但是如果 Tenant 继承自 User,并且 User 已经有一个 UserId PK,你就不需要在 Tenant 中再 PK...
  • 但是在我的 Seed() 方法中我没有创建用户实体,我只是创建从用户派生的实体,即租户和房东。那我分配PK不合适吗?
  • 我认为您确实不应该这样做。从 Tenant 类中删除 TenantId,并且不要在你的种子中设置“UserId”,你会没事的(几乎可以肯定)。
猜你喜欢
  • 1970-01-01
  • 2016-07-09
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多