Если я не сопоставлю столбец в EF с первым кодом для существующей БД, будет ли этот столбец работать? - PullRequest
1 голос
/ 21 сентября 2011

У меня определено следующее сопоставление:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<InsuranceProvider>()
                .Map(ins => ins.Properties(p => new
                {
                    PKID_Insuance = p.Id,
                    InsuranceProvider = p.Name,
                    Address1 = p.Address.Address1,
                    Address2 = p.Address.Address2,
                    City = p.Address.City,
                    State = p.Address.State,
                    Zipcode = p.Address.Zipcode,
                })).ToTable("Insurance");

        }

Таблица и объект имеют общие свойства, такие как Телефон и Факс, с одинаковым именем.Нужно ли явно отображать их или волшебным образом упадет на место?

Спасибо.

Решение:

Конечно, предложенное мной сопоставление действительноне работа.После того, как я работал с методом .HasColumnName (), я заменил это на код здесь и получил ошибку «выражение свойства .... не допустимо».Bummer.

Однако скаффолд "Create" в MVC 3 извлек как значения, которые я определил в отображении, так и значения из базы данных с общими именами.Забавно, как это работает.

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

Ответы [ 2 ]

1 голос
/ 21 сентября 2011

Это не будет работать. Отображение не является правильным. Он создаст две таблицы, потому что Map используется для работы с отображением наследования и разбиением сущностей (как указано @Slauma в комментарии), поэтому указанные вами свойства будут в таблице Insurance, а другие свойства + PK будут в другой таблице.

Также ваше использование Map неверно. Вы должны использовать анонимный тип без указания имен свойств.

Вы должны использовать подход, упомянутый @ Slauma.

1 голос
/ 21 сентября 2011

Работало ли это вообще то, что у вас до сих пор?Обычный способ сопоставления свойств с именами столбцов в БД:

modelBuilder.Entity<InsuranceProvider>()
    .Property(i => i.Name)
    .HasColumnName("InsuranceProvider");

modelBuilder.Entity<InsuranceProvider>()
    .Property(i => i.Address.Address1)
    .HasColumnName("Address1");
// assuming here that Address is a complex property, not a navigation property

// etc.

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

В качестве альтернативы вы можете использовать атрибут [Column("...")] для свойств в ваших классах модели (не работает, хотя для сложных свойств, я думаю, только для скаляров).

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