2017-01-18 4 views
0

Я получил сценарии базы данных от клиентов, которые нельзя изменить. Когда я пытаюсь создать объекты из этих сценариев с использованием EntityFramework базы данных Первый подход, ссылочная связь отсутствует из классов:Свойства навигации Entity Framework отсутствуют в первом подходе базы данных

CREATE TABLE agency(
    tenant_sktmp   INT    identity(1,1) not null, 
    rec_create_tmstptmp  DATETIME  NOT NULL, 
    rec_update_tmstptmp  DATETIME  NOT NULL, 
    rec_created_bytmp  VARCHAR(50), 
    rec_updated_bytmp  VARCHAR(50), 
    env_nametmp    VARCHAR(100) NOT NULL, 
    product_app_nametmp  VARCHAR(100) NOT NULL, 
    tenant_idtmp   VARCHAR(50)  NOT NULL, 
    tenant_nametmp   VARCHAR(100) NOT NULL 
    PRIMARY KEY (tenant_sktmp) 
) 


CREATE TABLE usertmp(
    user_sktmp    INT    identity(1,1) not null, 
    rec_create_tmstptmp DATETIME  NOT NULL, 
    rec_update_tmstptmp DATETIME  NOT NULL, 
    rec_created_bytmp  VARCHAR(50), 
    rec_updated_bytmp  VARCHAR(50), 
    user_nametmp   VARCHAR(100) NOT NULL, 
    tenant_idtmp   VARCHAR(50)  NOT NULL, 
    env_nametmp   VARCHAR(100) NOT NULL, 
    user_pwd_hashtmp  VARCHAR(255) NOT NULL, 
    user_first_nametmp  VARCHAR(200) NOT NULL, 
    user_last_nametmp  VARCHAR(200) NOT NULL, 
    user_hire_datetmp  DATETIME, 
    user_birth_datetmp  DATETIME, 
    user_staff_idtmp  VARCHAR(50), 
    user_santrax_idtmp  VARCHAR(50), 
    user_guidtmp   VARCHAR(128), 
    PRIMARY KEY (user_sktmp) 
) 

CREATE UNIQUE INDEX tmp12 ON agency(tenant_idtmp, env_nametmp) 
CREATE INDEX ref64tmp ON agency(env_nametmp) 


CREATE UNIQUE INDEX user_key1qqq ON usertmp(user_nametmp, env_nametmp, tenant_idtmp) 
CREATE INDEX ref56qq ON usertmp(tenant_idtmp, env_nametmp) 
CREATE INDEX ref67qq ON usertmp(env_nametmp) 

ALTER TABLE usertmp ADD CONSTRAINT Reftenant6tmp 
    FOREIGN KEY (tenant_idtmp, env_nametmp) 
    REFERENCES agency(tenant_idtmp, env_nametmp) 

Классы, созданные из EF базы данных первого подхода следующим образом:

public partial class usertmp 
    { 
     public int user_sktmp { get; set; } 
     public System.DateTime rec_create_tmstptmp { get; set; } 
     public System.DateTime rec_update_tmstptmp { get; set; } 
     public string rec_created_bytmp { get; set; } 
     public string rec_updated_bytmp { get; set; } 
     public string user_nametmp { get; set; } 
     public string tenant_idtmp { get; set; } 
     public string env_nametmp { get; set; } 
     public string user_pwd_hashtmp { get; set; } 
     public string user_first_nametmp { get; set; } 
     public string user_last_nametmp { get; set; } 
     public Nullable<System.DateTime> user_hire_datetmp { get; set; } 
     public Nullable<System.DateTime> user_birth_datetmp { get; set; } 
     public string user_staff_idtmp { get; set; } 
     public string user_santrax_idtmp { get; set; } 
     public string user_guidtmp { get; set; } 
    } 
public partial class agency 
    { 
     public int tenant_sktmp { get; set; } 
     public System.DateTime rec_create_tmstptmp { get; set; } 
     public System.DateTime rec_update_tmstptmp { get; set; } 
     public string rec_created_bytmp { get; set; } 
     public string rec_updated_bytmp { get; set; } 
     public string env_nametmp { get; set; } 
     public string product_app_nametmp { get; set; } 
     public string tenant_idtmp { get; set; } 
     public string tenant_nametmp { get; set; } 
    } 

Мы видим, что между двумя классами отсутствует связь. Как я могу убедиться, корабль отношения остается, поскольку у меня есть внешние ключи в таблице usertmp, которая ссылается на таблицу агентства.

Sql-скрипты не могут быть изменены. Любая помощь будет оценена по достоинству.

+0

Entity Framework поддерживает отношения только через ключевые поля. tenant_idtmp не является INT FK. –

+0

Даже если это целое число, то также я столкнулся с той же проблемой –

+0

Я предполагаю, что tenant_idtmp - это ваше поле, которое связывает. Не имеет значения, что это строки, проблема в том, что это не первичный ключ вашего класса агентства (tenant_sktmp), поэтому [EF не может установить отношения] (http://stackoverflow.com/questions/13498795/entity -framework-кода первой картография-без внешнего ключа). Однако вы могли бы присоединиться к объединению. –

ответ

0

Если у вас нет контроля над схемой, и вы используете неявные поля для связывания, то вы можете связать таблицы через JOIN Statements. Смотри ниже.

Кроме того, вы можете использовать аннотации к карте более дружественные свойства класса с менее читаемыми именами столбцов SQL (Вы должны сделать это в частных классах, так что не вытерли, когда вы регенерировать):

public partial class usertmp 
    { 
    ... 
    [Column("user_first_nametmp")] 
    public string FirstName { get; set; } 
    [Column("user_last_nametmp")] 
    public string LastName { get; set; } 
    [Column("user_birth_datetmp")] 
    public Nullable<System.DateTime> BirthDate { get; set; } 
    ... 
    } 

так что теперь вы можете присоединиться к:

var query = 
    from u in usertmp 
    join a in agency on u.tenant_idtmp equals a.tenant_idtmp 
    select new 
    { 
     FirstName = u.FirstName, 
     LastName = u.LastName, 
     BirthDate = u.BirthDate, 
     AgencyName = a.env_nametmp // You could map this to a friendly name as well 
    }; 

вы можете выбрать результаты в ViewModel или анонимный объект, как описано выше.