【问题标题】:Entity Framework Code First seeding entities having user id foreign key实体框架代码首先播种具有用户 ID 外键的实体
【发布时间】:2013-11-20 21:46:33
【问题描述】:

这是我的两个实体和上下文类:

public class ApplicationUser : IdentityUser
{
    [Required]
    public string FirstName { get; set; }

    [Required]
    public string LastName { get; set; }

    [Required]
    public string Email { get; set; }
}

public class Event
{
    public Guid Id { get; set; }

    [Required]
    public string Header { get; set; }

    [Required]
    public string Description { get; set; }

    [Required]
    public DateTime Date { get; set; }

    [Required]
    public ApplicationUser Host { get; set; }
}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public DbSet<Event> Events { get; set; }

    public ApplicationDbContext()
        : base("DefaultConnection")
    {
    }
}

这是我的种子方法:

protected override void Seed(ApplicationDbContext context)
    {
        var manager = new UserManager<ApplicationUser>(
            new UserStore<ApplicationUser>(
                new ApplicationDbContext()));

        var user0 = new ApplicationUser()
        {
            UserName = "User0",
            FirstName = "FirstName0",
            LastName = "LastName0",
            Email = "Email0@Example.com",
        };
        manager.Create(user0, "Password0");

        var user1 = new ApplicationUser()
        {
            UserName = "User1",
            FirstName = "FirstName1",
            LastName = "LastName1",
            Email = "Email1@Example.com",
        };
        manager.Create(user1, "Password1");

        var user2 = new ApplicationUser()
        {
            UserName = "User2",
            FirstName = "FirstName2",
            LastName = "LastName2",
            Email = "Email2@Example.com",
        };

        var eventObj = new Event()
        {
            Id = Guid.NewGuid(),
            Host = user0,
            Header = "Header0",
            Description = "Description0",
            Date = DateTime.Now
        };
        manager.Create(user2, "Password2");

        context.Events.AddOrUpdate(eventObj);
    }

当我在包管理器控制台中运行命令 Update-Database 时,我得到以下结果:

一个或多个实体的验证失败。有关详细信息,请参阅“EntityValidationErrors”属性。

我做错了什么?我正在开发 VS 2013 Asp.net Mvc 模板。

提前致谢,

【问题讨论】:

  • EntityValidationErrors 中的详细信息是怎么说的?发布。
  • - 用户:用户名 User0 已被占用。 @SOfanatic

标签: c# asp.net-mvc entity-framework ef-code-first entity-framework-migrations


【解决方案1】:

如果数据已经存在,则考虑以这种方式使用 addorupdate 数据刚刚更新。

种子数据:重写该类中的 Seed 方法以添加种子数据。 - 迁移到最新版本后将调用 Seed 方法。 - 您可以使用 DbContext.AddOrUpdate() 辅助扩展方法来避免创建重复的种子数据。例如

myContext.AddOrUpdate(c => c.FullName, 新客户 { FullName = "Andrew Peters", CustomerNumber = 123 }, );

【讨论】:

  • 抱歉,我没看到,我需要再滚动一点。
【解决方案2】:

context 参数传递到您的UserStore&lt;ApplicationUser&gt; 构造函数(您需要为您的用户使用相同的DbContext 实例,就像稍后在Seed 方法中用于您的事件一样):

protected override void Seed(ApplicationDbContext context)
    {
        var manager = new UserManager<ApplicationUser>(
            new UserStore<ApplicationUser>(
                // new ApplicationDbContext() // <- no
                context // yes!
                ));

【讨论】:

  • 显示您的 UserManagerUserStore 代码(至少足以看到调用 Create 会发生什么)
  • 哦,尝试将DbSet&lt;ApplicationUser&gt; 添加到您的DbContext - 不确定您的UserManager 没有它会做什么...
  • 这部分来自这篇文章:codeproject.com/Articles/674760/… 除了为 Event 实体播种外,一切正常。
【解决方案3】:

我改变了我的种子方法,现在它工作正常:

var manager = new UserManager<ApplicationUser>(
            new UserStore<ApplicationUser>(
                context));

        var user0 = new ApplicationUser()
        {
            UserName = "User0",
            FirstName = "FirstName0",
            LastName = "LastName0",
            Email = "Email0@Example.com",
        };
        manager.Create(user0, "Password0");

        var user1 = new ApplicationUser()
        {
            UserName = "User1",
            FirstName = "FirstName1",
            LastName = "LastName1",
            Email = "Email1@Example.com",
        };
        manager.Create(user1, "Password1");

        var user2 = new ApplicationUser()
        {
            UserName = "User2",
            FirstName = "FirstName2",
            LastName = "LastName2",
            Email = "Email2@Example.com",
        };

        var eventObj = new Event()
        {
            Id = Guid.NewGuid(),
            Host = user2,
            Header = "Header0",
            Description = "Description0",
            Date = DateTime.Now
        };

        context.Events.AddOrUpdate(eventObj);
        manager.Create(user2, "Password2");

现在我在将 Event 实体添加到上下文后调用 Create user 方法。

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 2011-08-05
    • 2016-09-25
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    相关资源
    最近更新 更多