EF 4.3 кодирует первые отношения "один к одному"

Может ли кто-нибудь сказать мне, что не так с этим кодом ниже, потому что у меня возникают проблемы с получением отношения один к одному, работающего сначала с кодом EF 4.3.

    // Problem with EF 4.3 code first, one-to-one relation

// context
// ------------
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{      
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

    modelBuilder.Entity<SecondModel>().HasRequired(r => r.FirstModel).WithOptional(r => r.SecondModel).WillCascadeOnDelete(false);
}


// models
// --------

public abstract class MyBaseEntity : // some interfaces
{
    // ...

    [EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)]
    public virtual int Id
    {
        get { return GetPropertyValue<int>("Id"); }
        set { SetPropertyValue<int>("Id", value); }
    }

    // ...
}

public class FirstModel : MyBaseEntity
{
    // ...

    public int SecondModelID { get; set; }
    public virtual SecondModel SecondModel { get; set; }

    // ...
}

public class SecondModel : MyBaseEntity
{
    // ...

    public int FirstModelID
    {
        get { return GetPropertyValue<int>("FirstModelID"); }
        set { SetPropertyValue<int>("FirstModelID", value); }
    }
    public virtual FirstModel FirstModel { get; set; }

    // ...
}

// this code above doesn't seem to work :s
// when removing FirstModelID and removing SecondModelID i'm unable to create the the database

Пробовали всевозможные вещи, добавляли атрибуты внешнего ключа, (не) комментировали некоторые идентификаторы, следовали образцам. Результаты были всегда: ID в базе данных неправильные или не создает базу данных.

Заранее спасибо.


person juFo    schedule 15.02.2012    source источник
comment
Пытались ли включить stackoverflow.com/questions/5339951/ ?   -  person Gert Arnold    schedule 16.02.2012


Ответы (1)


У меня нет EF 4.3, но удивительно, если в этом отношении он отличается от EF 4.1. Я сделал это, настроив модель в свободном API, переопределив ModelBuilder внутри класса DbContext:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
         modelBuilder.Entity<FirstModel>()
            .HasRequired(e => e.SecondModel)
            .WithRequiredPrincipal()
            .WillCascadeOnDelete(true);

            base.OnModelCreating(modelBuilder);

    }

И классы:

public class FirstModel : MyBaseEntity
{
// ...

public virtual SecondModel SecondModel { get; set; }

// ...
}

public class SecondModel : MyBaseEntity
{
// ...

public int Id
{
    get { return GetPropertyValue<int>("FirstModelID"); }
    set { SetPropertyValue<int>("FirstModelID", value); }
}


// ...
}
person cfs    schedule 15.02.2012
comment
Мне действительно пришлось работать с modelBuilder. Похоже на работу с наследованием и EF это PITA.. - person juFo; 04.03.2012