Ошибка, связанная с FK в отношениях «один ко многим» - PullRequest
2 голосов
/ 01 апреля 2012

Я использую EF 5 Beta 2 Code-First.Я создал файл edmx, в котором есть 2 сущности, среди которых Марка и Автомобиль .

Один Марка может иметь ноль или более (многие) Транспортное средство и каждое Транспортное средство должно иметь Марку (обязательно). Автомобиль имеет внешний ключ с именем BrandID , который не обнуляется .

(relationship)   
    Brand  +------------------->  Vehicle
          (1)                  (*)

Также я использовал EF 5 DbContextГенератор для создания классов POCO.

Проблема

Когда я пытаюсь либо читать, либо писать записи, я получаю следующую ошибку:

ошибка 3023: Проблема при отображении фрагментов, начиная со строки 155: Столбец Vehicle.BrandID в таблице Транспортное средство должно быть отображено: оно не имеет значения по умолчанию и не может обнуляться.

Примечание: я использую TPC отображение наследования, где Vehicle - это абстрактный базовый класс , из которого выводятся 2 класса ( Car & Motorbike ).

Вотопределение класса плюс соответствующий свободный API-код:

//------------ Class definiions ---------------

public abstract partial class Vehicle
{
    public int VehicleID { get; set; }
    public short BrandID { get; set; }

    public virtual Brand Brand { get; set;
}

public partial class Car : Vehicle
{
    public string BodyType { get; set; }
}

public partial class Motorbike : Vehicle
{
}

public partial class Brand
{
    public Brand()
    {
        this.Vehicles = new HashSet<Vehicle>();
    }        

    public short BrandID { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Vehicle> Vehicles { get; set; }
}


//--------------- Fluent API code ---------------

modelBuilder.Entity<Vehicle>()
    .Property(p => p.VehicleID)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);    

modelBuilder.Entity<Car>()
    .Map(m =>
    {
        m.ToTable("Car");
        m.MapInheritedProperties();
    });

modelBuilder.Entity<Motorbike>()
    .Map(m =>
    {
        m.ToTable("Motorbike");
        m.MapInheritedProperties();
    });

modelBuilder.Entity<Brand>()
    .HasMany(b=>b.Vehicles)
    .WithRequired(v=>v.Brand)
    .HasForeignKey(p => p.BrandID);


modelBuilder.Entity<Brand>()
    .Property(p => p.BrandID)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

Это так странно, поскольку все кажется нормальным и проверено несколько раз.

Любые мысли будут высоко оценены.

1 Ответ

1 голос
/ 01 апреля 2012

наследование TPC просто не работает для модели такого типа, где у вас есть свойство навигации базового типа:

... использование TPC в EF заставляет вас избегать ассоциаций в вашембазовый тип ...

(Цитата здесь: http://blogs.msdn.com/b/alexj/archive/2009/04/15/tip-12-choosing-an-inheritance-strategy.aspx)

Вы должны использовать наследование TPT или TPH для вашей модели.

...