Entity Framework 4.1 Code First - Таблица для иерархии без столбца дискриминатора - PullRequest
0 голосов
/ 12 сентября 2011

Я хочу разбить таблицу в разных моделях для использования в разных представлениях.

public class User
{
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
}
public class UserFull : User
{
        public string Street { get; set; }
        public string Country { get; set; }
}

public class theDBtoUse : DbContext
{

    public DbSet<User> User { get; set; }
    public DbSet<UserFull> UserFull { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>().Property(r => r.Id).HasColumnName("user_id");
        modelBuilder.Entity<User>().Property(r => r.FirstName).HasColumnName("user_firstname");
        modelBuilder.Entity<User>().Property(r => r. LastName).HasColumnName("user_lastname");

        modelBuilder.Entity<User>().ToTable("user");

        modelBuilder.Entity<UserFull>().Property(r => r.Street).HasColumnName("user_street ");
        modelBuilder.Entity<UserFull>().Property(r => r.Country).HasColumnName("user_country");

        base.OnModelCreating(modelBuilder);
    }


}

Когда я использую это.Сказал, что в нем отсутствует столбец «Дискриминатор»

theDBtoUse theDB = new theDBtoUse();

var theUserToMatch = (from r in theDB.UserFull
                                  where r.Street.ToLower() == "astreetname"
                                  select r);

if theUserToMatch () == 0) // throws - Invalid column name 'Discriminator'

Может кто-нибудь помочь мне с тем, как использовать разные модели для одной и той же таблицы базы данных.и, пожалуйста, не предлагайте другие решения.

Ответы [ 2 ]

4 голосов
/ 12 сентября 2011

Это невозможно. Вы злоупотребляете наследованием сущностей.

Прежде всего, у вас никогда не будет TPH без столбца дискриминатора, потому что у вас никогда не будет двух сущностей, сопоставленных с одной и той же записью базы данных. Это означает, что ваша запись в базе данных может быть только User или UserFull, но никогда не быть обоими.

Вы должны различаться между объектом и моделью представления. Эти двое не одинаковы. Сущность - это то, что вы хотите сохранить, и это полный сбор данных. Модель представления - это подмножество одной или нескольких сущностей, представленных в представлении.

В вашем случае наиболее очевидным решением является класс User со всеми полями и запросом проекции для настраиваемого неотображенного представления для ограниченного просмотра пользователем.

Сопоставленная сущность и модель полного вида:

public class User
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Street { get; set; }
    public string Country { get; set; }
}

Модель ограниченного вида без сопоставления:

public class UserLimitedView
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

Отображение:

public class theDBtoUse : DbContext
{
    public DbSet<User> User { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>().Property(r => r.Id).HasColumnName("user_id");
        modelBuilder.Entity<User>().Property(r => r.FirstName).HasColumnName("user_firstname");
        modelBuilder.Entity<User>().Property(r => r. LastName).HasColumnName("user_lastname");
        modelBuilder.Entity<User>().Property(r => r.Street).HasColumnName("user_street ");
        modelBuilder.Entity<User>().Property(r => r.Country).HasColumnName("user_country");

        base.OnModelCreating(modelBuilder);
    }
}

Запрос:

var data = context.Users
                  .Where(...)
                  .Select(u => new UserLimitedView
                      {
                          Id = u.Id,
                          FirstName = u.FirstName,
                          LastName = u.LastName
                      });

var fullData = context.Users.Where(...);

Во-первых, EF-код не имеет встроенной поддержки отображения для непосредственного отображения проекций. В случае EDMX проекции могут быть частью отображения через QueryView.

0 голосов
/ 10 апреля 2012

Украсьте свой производный класс с

[Table("tablename")]

Пожалуйста, найдите полный проект ниже (просто добавьте app.config)

using System;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;
using System.Linq;

namespace Bookstore
{
    public class User
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

    [Table("UsersFull")]
    public class UserFull : User
    {
        public string Street { get; set; }
        public string Country { get; set; }
    }

    public class Context : DbContext
    {
        static Context()
        {
            Database.SetInitializer<Context>(null);
        }

        public DbSet<User> Users { get; set; }
        public DbSet<UserFull> UsersFull { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var context = new Context();
            context.Database.Delete();
            context.Database.Create();


            var userFull = new UserFull { Country = "Alabama", FirstName = "John", LastName = "Capioca", Street = "astreetname" };
            context.UsersFull.Add(userFull);
            context.SaveChanges();

            var theUserToMatch = (from r in context.UsersFull
                                  where r.Street.ToLower() == "astreetname"
                                  select r);

            if (theUserToMatch.Count() != 0)
                Console.WriteLine("Yeah! No Invalid column name 'Discriminator' exception");

            Console.ReadLine();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...