Сначала код EF - составной ключ - PullRequest
3 голосов
/ 03 августа 2010

У меня есть устаревшая база данных, в которой есть два столбца, и я хочу отобразить их как 1 ID, если это возможно

, например

    public class Product
{ 
public string ProductID {get;set;}
public string ShortDescription {get;set;}
public string UserName {get;set;}
}

, тогда мой Modelbinder будет выглядеть так

modelBinder.Entity<Product>().
HasKey(p=>p.ProductID)
.MapSingle(product =>
new {
 colShotDesc = product.ShortDescription,
 colUser = product.UserName
}
).ToTable("Products");

Что мне нужно, это что-то вроде ProductID = ShortDescription + UserName в отображении ... потому что эти два столбца имеют однозначное ключевое ограничение ...

Не знаю, имеет ли это смыслно любые предложения были бы хорошими ... Пожалуйста, не спрашивайте о дизайне базы данных => это так, как оно есть и не должно быть изменено ... вот почему я подумал, что EF-код в первую очередь может помочь мне (надеюсь, скрестив пальцы)... потому что, похоже, что в БД не определены pk, только ограничения уникальных ключей ...

в любом случае ... помощь будет потрясающей ..

Ответы [ 2 ]

11 голосов
/ 16 апреля 2011

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

EF CF не может сделать это на данный момент.

Вы можете сообщить EF CF о составном ключе через атрибут Key или FluentAPI.

Аннотация данных:

public class Product 
{  
  [Key, Column(Order=0)]
  public string ShortDescription {get;set;} 
  [Key, Column(Order=1)]
  public string UserName {get;set;} 
}

Fluent API:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
  modelBuilder.Entity<Product>()
               .HasKey(p=> new{p.ShortDescription, p.UserName});
}

Вы можете создать сложный тип, который вы можете использовать в своем коде, чтобы работать так, как вы хотите, чтобы ваш код работал концептуально.

public class Product 
{  
  public ProductID Key {get;set;}
}

public class ProductID 
{
  public string ShortDescription {get;set;} 
  public string UserName {get;set;} 
}

Затем отобразить его с помощью Fluent API:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
  modelBuilder.ComplexType<ProductID>()
               .Property(p=>p.ShortDescription)
               .HasColumnName("ShortDescription")
               .Property(p=>p.UserName)
               .HasColumnName("UserName");
}

Или, если вы хотите использовать аннотации данных:

[ComplexType]
public class ProductID
{
  [Column("ShortDescription")]
  public string ShortDescription {get;set;} 
  [Column("UserName")]
  public string UserName {get;set;} 
}

Вы должны указать имена столбцов, или в конфигурации предполагается, что имена столбцов - ProductID_ShortDescription ....

Вот еще немного информации о сложных типах.

0 голосов
/ 04 августа 2010

На самом деле вы хотите отобразить одно концептуальное свойство на пару столбцов хранилища.Существует код, который объединит значения из столбцов в свойство, пока все хорошо.Но давайте представим процесс добавления нового объекта в контекст.Итак, мы установили значение для свойства.Как EF должна знать правило для записи значения этого свойства в оба столбца?Не уверен, что этот сценарий можно реализовать.

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