Отображение один в один в EF Code First и свойства двунаправленной навигации - PullRequest
1 голос
/ 20 октября 2011

Мне было поручено перенести старое приложение в MVC 3, и я хочу сначала использовать код EF для репликации существующей схемы базы данных. Текущая кодовая база изобилует жестко закодированными командами SQL, и поэтому модель, которую я придумаю, должна быть «совместимой» с тем, что ожидает текущая система. Я знаю, что мог бы использовать базу данных EF First для этого, но существующая схема настолько проста, что я не вижу причин для того, чтобы сначала не использовать код, так как я хочу создать прочную основу для перехода от нашей старой жестко закодированной базы данных взаимодействия.

Как мне нужно, чтобы POCO выглядело так:

public class Owner
{
    [Key]
    public Guid Owner_Id { get; set; }

    // Properties
    public string ContactName { get; set; }
    public string PhoneNumber { get; set; }
    public string Email { get; set; }

    // Navigational properties
    public virtual ICollection<Plant> Plants { get; set; }
}

public class Plant
{
    [Key]
    public Guid Plant_Id { get; set; }

    // Properties
    public string Address { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string Zip { get; set; }

    // Foreign Keys
    public Guid Owner_Id { get; set; }

    // Navigational properties
    public virtual Owner Owner { get; set; }
    public virtual License License { get; set; }
}

public class License
{
    [Key] public Guid License_Id { get; set; }

    // Properties
    public int Total { get; set; }
    public int Users { get; set; }
    public string Key { get; set; }

    // Foreign Keys
    public Guid Plant_Id { get; set; }

    // Navigational properties
    public virtual Plant Plant { get; set; }
}

Это дает мне эту ошибку при попытке создать контекст:

«Невозможно определить основной конец ассоциации между типами« Лицензия »и« Завод ». Основной конец этой ассоциации должен быть явно настроен с использованием либо API-интерфейса свободной связи, либо аннотаций данных.»

Я понимаю, что у Plant должна быть пустая ссылка FK на License_Id, а у лицензии не должно быть FK для Plant_Id. Но это карты, которые мне сдали. Возможно ли то, что я пытаюсь сделать в EF?

Ответы [ 2 ]

1 голос
/ 21 октября 2011
public class Plant
{
    public Guid PlantID { get; set; }
    public virtual License License { get; set; }
} 

public class License
{
     // No need to have a PlantID foreign key since the foreign key.
     public Guid LicenseID { get; set; }
     public virtual Plant Plant { get; set; }
}

В свободно-API (в вашем контексте класса):

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Plant>().HasOptional(p => p.License).WithRequired(l => l.Plant);  

Единственное понижение - это то, что вы фактически определили один к нулю или один. (который может быть обработан в коде. но все же ...) Для получения дополнительной информации об отношениях «один к одному», пожалуйста, ознакомьтесь с Кодекс структуры сущностей отношения «Один к одному»

1 голос
/ 20 октября 2011

попробуйте добавить в Лицензию

// Foreign Keys
public Guid Plant_Id { get; set; }

// Navigational properties
[ForeignKey("Plant_Id")]
public virtual Plant Plant { get; set; }

сообщить ему, что это внешний ключ, то же самое для других внешних ключей.

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Plant>()
            .HasOptional(e => e.License)
            .WithOptionalPrincipal(e => e.Plant);

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