DataBase第一种方法中缺少实体框架导航属性

时间:2017-01-18 16:42:18

标签: c# mysql sql entity-framework

我收到了客户无法更改的数据库脚本。 当我尝试使用EntityFramework Database First方法从这些脚本创建实体时,类中缺少引用关系:

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脚本。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分: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或匿名对象,如上所述。