Отображение FluentAPI с помощью POCO в EF4.1 - PullRequest
1 голос
/ 19 марта 2012

Я изучаю EF4.1 против базы данных северного ветра.Я специально создал класс POCO, подобный этому, с неидентичными именами столбцов и свойствами, которых нет в схеме, поэтому я могу изучить картографирование при подготовке к обновлению моего старого приложения:

  public class Product
    {
        public int ProductID { get; set; }
        public string ProductName { get; set; }
        public Decimal? UnitPrice { get; set; }
        public bool Discontinued { get; set; }
        public Int16 QuantityInStock { get; set; }
        public int CategoryID { get; set; }
        public Category Category { get; set; }
    }

Я хочусопоставить мою схему с этой сущностью следующим образом:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Product>().Map(config =>
        {
            config.Properties(p => new
            {
                p.ProductName,
                p.ProductID,
                p.CategoryID,
                p.Discontinued,
                p.UnitPrice
            });
        });
    modelBuilder.Entity<Product>().ToTable("Products");
    base.OnModelCreating(modelBuilder);
}

Странно, когда я пытаюсь это сделать:

Product tmp = db.Products.Find(4);

Я получаю это исключение и не могу сказать, почему, так как я ссылаюсьи я даже сопоставил его ToTable («Продукты»): {"Invalid object name 'dbo.Product1'."}

Почему это происходит?

1 Ответ

1 голос
/ 19 марта 2012

С modelBuilder.Entity<Product>().Map вы используете довольно сложную опцию отображения в Code-First, которая называется Table Splitting . Ваше сопоставление говорит о том, что свойства вашей сущности Product, которые вы перечислили в Properties(p => new...), должны быть сопоставлены с другой таблицей, чем остальные свойства. Остальные свойства находятся в таблице Products, как вы определили в своем вызове ToTable. Для других свойств вы вообще не указали имя таблицы (которое должно быть ToTable в действии Map(config => config.ToTable(...) ...). Я предполагаю, что EF предполагает какое-то имя таблицы по умолчанию Product1, которое, очевидно, не существует.

Я не уверен, действительно ли вы хотите разделить вашу сущность на две разные таблицы. Читая ваши первые предложения ...

... неидентичные имена столбцов и свойства, которые не существуют в схема ...

... Я думаю, вам нужны в основном следующие два параметра сопоставления:

Свойства в классе модели без соответствующих столбцов в базе данных не являются сопоставленными свойствами:

modelBuilder.Entity<Product>().Ignore(p => p.QuantityInStock);

С аннотациями данных:

[NotMapped]
public Int16 QuantityInStock { get; set; }

И вы можете сопоставить имя свойства с именем другого столбца:

modelBuilder.Entity<Product>().Property(p => p.Discontinued)
    .HasColumnName("MyOtherColumnName");

С аннотациями данных:

[Column("MyOtherColumnName")]
public bool Discontinued { get; set; }
...