C# 数据库优先方法中缺少实体框架导航属性

C# 数据库优先方法中缺少实体框架导航属性,c#,mysql,sql,entity-framework,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

我从客户处收到了无法更改的数据库脚本。 当我尝试使用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; }
    }
public部分类usertmp
{
公共int用户_sktmp{get;set;}
public System.DateTime rec_create_tmstptpmp{get;set;}
public System.DateTime rec_update_tmstptpmp{get;set;}
公共字符串rec_由tmp{get;set;}创建
公共字符串rec_由tmp{get;set;}更新
公共字符串用户_nametmp{get;set;}
公共字符串租户_idtmp{get;set;}
公共字符串env_nametmp{get;set;}
公共字符串用户\u pwd\u hashtmp{get;set;}
公共字符串用户\u first\u nametmp{get;set;}
公共字符串用户\u last\u nametmp{get;set;}
公共可空用户\u hire\u datetmp{get;set;}
公共可为空的用户\u birth\u datetmp{get;set;}
公共字符串用户\u staff\u idtmp{get;set;}
公共字符串用户_santrax_idtmp{get;set;}
公共字符串用户\u guidtmp{get;set;}
}
公共部分阶级机构
{
公共int租户_sktmp{get;set;}
public System.DateTime rec_create_tmstptpmp{get;set;}
public System.DateTime rec_update_tmstptpmp{get;set;}
公共字符串rec_由tmp{get;set;}创建
公共字符串rec_由tmp{get;set;}更新
公共字符串env_nametmp{get;set;}
公共字符串乘积_app_nametmp{get;set;}
公共字符串租户_idtmp{get;set;}
公共字符串租户_nametmp{get;set;}
}
我们可以看到这两个类之间缺少关系。 我如何确保关系保持不变,因为我在引用代理表的usertmp表中有外键

无法更改Sql脚本。
任何帮助都将不胜感激。

如果您无法控制架构,并且正在使用非键字段进行链接,那么您可以通过将表关联起来。见下文

此外,您还可以使用注释将更友好的类属性映射到可读性较差的SQL列名(您需要在分部类中执行此操作,以便在重新生成时不会将其删除):


您可以如上所述将结果选择到ViewModel或匿名对象中。

Entity Framework仅支持通过键字段建立关系。tenant_idtmp似乎不是INT FK。即使它是整数,我也面临同样的问题我假设tenant_idtmp是链接的字段。这些都是字符串没有区别,问题是它不是代理类的主键(tenant_sktmp是)所以。不过你可以加入。谢谢史蒂夫。你能举一个简单的加入例子吗?谢谢
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
    };