使用外键关系创建的EF Core 2重复列

时间:2018-03-23 20:40:07

标签: entity-framework-core asp.net-core-2.0 entity-framework-core-migrations

我尝试使用EF core 2 code first方法添加迁移。问题是,具有外键关系的实体是使用外键ID后缀' 1'创建的。在最后和一个具有相同名称但在末尾没有1的冗余列,这不是外键。

示例是我的2个类,Store和StoreVisit,如下所示:

商品

[Table("Store")]
public class Store
{
    public Store()
    {
        StoreVisits = new HashSet<StoreVisit>();
    }
    [Key]
    public int StoreId { get; set; }

    [StringLength(30)] 
    public string ShopName { get; set; }

    [StringLength(50)]
    public string ShopKeeper { get; set; } 

    public string ContactNo { get; set; }

    [StringLength(70)]
    public string Address { get; set; }

    [StringLength(20)]
    public string Street { get; set; }

    [StringLength(50)] 
    public string City { get; set; }

    public IEnumerable<StoreVisit> StoreVisits { get; set; }
}

商店访问

[Table("StoreVisit")]
public class StoreVisit
{

    [Key]
    public int StoreVisitId { get; set; }

    [StringLength(50)]
    public string Location { get; set; }

    [StringLength(50)]
    public string Notes { get; set; }

    [DataType(DataType.Time)]
    public DateTime StartTime { get; set; }

    [DataType(DataType.Time)]
    public DateTime EndTime { get; set; }

    public Store Store { get; set; }

}

在数据库中创建了Visit类,其中的列如下图所示:

enter image description here

正如您所看到的,StoreVisit表中包含列&#34; StoreId1&#34;这是实际的外键和&#34; StoreId&#34;这不是外键。

我甚至配置了与Fluent API的关系,如下所示:

            modelBuilder.Entity<Store>()
            .HasMany(c => c.StoreVisits)
            .WithOne(e => e.Store)
            .IsRequired();

有人可以提供帮助。

2 个答案:

答案 0 :(得分:1)

请注意,Entity Framework Core 足够聪明,可以检测您的类之间的关系,如果您使用其conventions,它们将变成具有关系的数据库表。因此,这是多余的,以便在[Key]属性上方使用像StoreId这样的注释。

第二件事,作为建议,请尝试对类或属性使用简单明了的名称,因为它们可能类似于EF自动创建的名称。例如,在您的情况下,我希望避免在store类名内再次使用StoreVisit(例如,在多对多关系的情况下,派生表命名为 StoreVisit 就像您雇用的时候没有's'一样,尽管您的情况是一对多 ),

最终提示是出现多余的 StoreId 列的原因。实际上,就您而言,使用Fluent API并不是必需的,因为EF可以检测到这种关系。此外,您为modelBuilder编写了错误的配置。 因此将其删除,并让EF生成它(除非您打算建立充分定义的关系以在代码中消耗其优势)

  • StoreId 是您告诉EF生成的(如required) 在modelBuilder中。
  • StoreId1 是EF自动生成的列(外键),基于 许多关系。附加“ 1”以避免重复的列名。

答案 1 :(得分:0)

需要在类上定义外键。

import React from 'react';
import { Link} from 'react-router-dom';
import { withRouter } from 'react-router'
import Button from '@material-ui/core/Button';
import Menu from '@material-ui/core/Menu';
import MenuItem from '@material-ui/core/MenuItem';

class SimpleMenu extends React.Component {
  state = {
      notFound: false,
      value: false,
      anchorEl: null,
  };

  handleIndustriesOpen = event => {
    this.setState({ anchorEl: event.currentTarget });
  };

  handleIndustriesClose = () => {
    this.setState({ anchorEl: null });
  };

  render() {
    const { location: { pathname } } = this.props;
    const { anchorEl } = this.state;

    return (
      <div>
       <Button
          aria-owns={anchorEl ? 'industries-menu' : null}
          aria-haspopup="true"
          onClick={this.handleIndustriesOpen}
        >
          Open Menu
        </Button>
        <Menu
          id="industries-menu"
          anchorEl={anchorEl}
          open={Boolean(anchorEl)}
          onClose={this.handleIndustriesClose}
          MenuListProps={{
            name: 'industry'
          }}
        >
          <MenuItem selected={pathname === '/home/industry/aerospace'} onClick={this.handleIndustriesSelect} component={Link} to='/home/industry/aerospace'>Aerospace</MenuItem>
          <MenuItem selected={pathname === '/home/industry/automotive'} onClick={this.handleIndustriesClose} component={Link} to='/home/industry/automotive'>Automotive</MenuItem>
          <MenuItem selected={pathname === '/home/industry/energy'} onClick={this.handleIndustriesClose} component={Link} to='/home/industry/energy'>Energy</MenuItem>
          <MenuItem selected={pathname === '/home/industry/industrial'} onClick={this.handleIndustriesClose} component={Link} to='/home/industry/industrial'>Industrial</MenuItem>
          <MenuItem selected={pathname === '/home/industry/marine'} onClick={this.handleIndustriesClose} component={Link} to='/home/industry/marine'>Marine</MenuItem>
          <MenuItem selected={pathname === '/home/industry/medical-technologies'} onClick={this.handleIndustriesClose} component={Link} to='/home/industry/medical-technologies'>Medical Technologies</MenuItem>
          <MenuItem selected={pathname === '/home/industry/tool-manufacturers'} onClick={this.handleIndustriesClose} component={Link} to='/home/industry/tool-manufacturers'>Tool Manufacturers</MenuItem>
          <MenuItem selected={pathname === '/home/industry/mixed-parts'} onClick={this.handleIndustriesClose} component={Link} to='/home/industry/mixed-parts'>Mixed Parts</MenuItem>
          <MenuItem selected={pathname === '/home/industry/watch'} onClick={this.handleIndustriesClose} component={Link} to='/home/industry/watch'>Watch</MenuItem>
      </Menu>
      </div>
    );
  }
}

export default withRouter(SimpleMenu);

将外键引用添加到Fluent API也很不利。

[Table("StoreVisit")]
public class StoreVisit
{

    [Key]
    public int StoreVisitId { get; set; }

    public int StoreId { get; set; }

    [StringLength(50)]
    public string Location { get; set; }

    [StringLength(50)]
    public string Notes { get; set; }

    [DataType(DataType.Time)]
    public DateTime StartTime { get; set; }

    [DataType(DataType.Time)]
    public DateTime EndTime { get; set; }

    public Store Store { get; set; }

}