2

我正在使用 EF5 代码优先、迁移和按类型继承的表。我有一些从其他类继承的类。例如TenantLandlord继承自UserProfile.

我正在使用该protected override void Seed()方法将测试数据添加到我的数据库中。因此,例如,我创建了 2 个UserProfile对象和 1Tenant和 1 Landlord。如何确保租户实体与第一个用户配置文件实体相关联,而房东实体与第二个用户配置文件实体相关联?因为我使用的是 table-per-type 继承,我是否需要明确地说UserId派生类的 等于UserId其基类的?我四处寻找,但找不到任何有用的东西。我尝试按如下方式进行:

protected override void Seed(Context context)
    {
        var users = new List<UserProfile>
        {
             new UserProfile { UserId=1, UserName="Matt", Email="a@a.com", AccountType=AccountType.Tenant },
             new UserProfile { UserId=2, UserName="Dave", Email="a@a.com", AccountType=AccountType.Landlord }
        };
        users.ForEach(u => context.UserProfile.AddOrUpdate(u));
        context.SaveChanges();

        var tenants = new List<Tenant>
        {
            new Tenant { UserId = users.Single(x => x.UserId = 1) /* other properties */  }
            // ...
        };
        tenants.ForEach(t => context.Tenant.AddOrUpdate(t));
        context.SaveChanges();

        var landlords = new List<Landlord>
        {
            new Landlord { UserId = users.Single(x => x.UserId = 2) /* other properties */ }
            // ...
        };
        landlords.ForEach(l => context.Tenant.AddOrUpdate(l));
        context.SaveChanges();
    }
4

2 回答 2

1

尽管 Maximc 的想法是正确的,但我发现您可以使用该DbContext.Set<T>方法来AddOrUpdate为您的子类使用该方法,而无需先手动从数据库中获取它们:

protected override void Seed(Context context)
{            
    context.Set<Tenant>().AddOrUpdate(
        t => t.UserName, // or whatever property you want to use as an identifier for duplicates
        new Tenant { UserId=1, UserName="Matt", Email="a@a.com" });

    context.Set<Landlord>().AddOrUpdate(
        t => t.UserName,
        new Tenant { UserId=2, UserName="Dave", Email="a@a.com" });
}

此外,您可能不应该自己指定鉴别器(在您的情况下为 AccountType)。当您正确设置 POCO 继承时,Entity Framework 将在后台为您处理。

于 2014-02-11T12:14:30.000 回答
1

您必须使用 DbContext 来加载要分配给它的实体。

这应该这样做:

protected override void Seed(Context context)
    {
        var users = new List<UserProfile>
    {
         new UserProfile { UserId=1, UserName="Matt", Email="a@a.com", AccountType=AccountType.Tenant },
         new UserProfile { UserId=2, UserName="Dave", Email="a@a.com", AccountType=AccountType.Landlord }
    };
        users.ForEach(u => context.UserProfile.AddOrUpdate(u));
        context.SaveChanges();

        var tenants = new List<Tenant>
    {
        new Tenant { UserId = users.Single(x => x.UserId = context.UserProfile.First(x=>x.UserId = 1)) /* other properties */  }
        // ...
    };
        tenants.ForEach(t => context.Tenant.AddOrUpdate(t));
        context.SaveChanges();

        var landlords = new List<Landlord>
    {
        new Landlord { UserId = users.Single(x => x.UserId = context.UserProfile.First(x=>x.UserId = 2)) /* other properties */ }
        // ...
    };
        landlords.ForEach(l => context.Tenant.AddOrUpdate(l));
        context.SaveChanges();
    }
于 2013-02-03T15:36:50.990 回答