我尝试使用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类,其中的列如下图所示:
正如您所看到的,StoreVisit表中包含列&#34; StoreId1&#34;这是实际的外键和&#34; StoreId&#34;这不是外键。
我甚至配置了与Fluent API的关系,如下所示:
modelBuilder.Entity<Store>()
.HasMany(c => c.StoreVisits)
.WithOne(e => e.Store)
.IsRequired();
有人可以提供帮助。
答案 0 :(得分:1)
请注意,Entity Framework Core 足够聪明,可以检测您的类之间的关系,如果您使用其conventions,它们将变成具有关系的数据库表。因此,这是多余的,以便在[Key]
属性上方使用像StoreId
这样的注释。
第二件事,作为建议,请尝试对类或属性使用简单明了的名称,因为它们可能类似于EF自动创建的名称。例如,在您的情况下,我希望避免在store
类名内再次使用StoreVisit
(例如,在多对多关系的情况下,派生表命名为 StoreVisit 就像您雇用的时候没有's'一样,尽管您的情况是一对多 ),
最终提示是出现多余的 StoreId 列的原因。实际上,就您而言,使用Fluent API并不是必需的,因为EF可以检测到这种关系。此外,您为modelBuilder
编写了错误的配置。 因此将其删除,并让EF生成它(除非您打算建立充分定义的关系以在代码中消耗其优势)
required
)
在modelBuilder
中。答案 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; }
}