2010-08-03 5 views
3

У меня есть наследие базы данных, которая имеет два collumns и я хочу, чтобы отобразить их как 1 ID это возможноEF код первого - составной ключ

, например

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 в отображении ... , потому что эти два collumns разделяют Uniq ue key contraint ...

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

все равно ... помощь была бы потрясающей.

ответ

0

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

+0

Да, я согласен, что это не так чисто, но это дБ, с которым я столкнулся.Поскольку эти два столбца имеют уникальное ограничение на уровне базы данных, следует убедиться, что они будут установлены. Я также работаю с Validation, чтобы убедиться, что они установлены. Я хочу, чтобы мое решение в коде стало чистым litle, поэтому я ищу составной ProductID. Как я могу собрать мои конкатенированные поля вначале кода? –

11

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

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 ....

Here's some more info on Complex Types.

Смежные вопросы