C# 一对一成为一对多实体框架,首先生成数据库
我首先生成实体框架数据库(数据库中的EF设计器)。我在Microsoft SQL Server中有两个表:C# 一对一成为一对多实体框架,首先生成数据库,c#,sql-server,entity-framework,ef-database-first,C#,Sql Server,Entity Framework,Ef Database First,我首先生成实体框架数据库(数据库中的EF设计器)。我在Microsoft SQL Server中有两个表: CREATE TABLE dbo.Person ( Pk_Person_Id INT IDENTITY PRIMARY KEY, Name VARCHAR(255), EmailId VARCHAR(255), ); CREATE TABLE dbo.PassportDetails ( Pk_Passport_Id INT PRIMARY KEY,
CREATE TABLE dbo.Person
(
Pk_Person_Id INT IDENTITY PRIMARY KEY,
Name VARCHAR(255),
EmailId VARCHAR(255),
);
CREATE TABLE dbo.PassportDetails
(
Pk_Passport_Id INT PRIMARY KEY,
Passport_Number VARCHAR(255),
Fk_Person_Id INT UNIQUE
FOREIGN KEY REFERENCES dbo.Person(Pk_Person_Id)
);
INSERT INTO dbo.Person
VALUES ('Niraj','v.a@emails.com'),
('Vishwanath','v.v@emails.com'),
('Chetan','c.v@emails.com');
GO
INSERT INTO dbo.PassportDetails
VALUES (101, 'C3031R33', 1), (102, 'VRDK5695', 2), (103, 'A4DEK33D', 3);
GO
SELECT * FROM dbo.Person
SELECT * FROM dbo.PassportDetails;
在SQL Server中,关系显示为一对一,因为Fk_Person_Id
设置为isUnique=true
:
Fk_Person_Id INT UNIQUE
FOREIGN KEY REFERENCES dbo.Person(Pk_Person_Id));
现在在Visual Studio中,我添加了一个新的ADO.NET实体数据模型->数据库中的EF设计器->选择这两个表,并默认保留所有复选框选项
生成完成后,我在Visual Studio图表.edmx
中看到了这一点:
一对多的关系发生了变化——为什么?这是错的吗?我不想一个人收集护照——这不是我试图描述的逻辑
以及环境足迹代码:
public partial class Person
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Person()
{
this.PassportDetails = new HashSet<PassportDetail>();
}
public int Pk_Person_Id { get; set; }
public string Name { get; set; }
public string EmailId { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<PassportDetail> PassportDetails { get; set; }
}
public partial class PassportDetail
{
public int Pk_Passport_Id { get; set; }
public string Passport_Number { get; set; }
public Nullable<int> Fk_Person_Id { get; set; }
public virtual Person Person { get; set; }
}
公共部分类人员
{
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2214:DoNotCallOverridableMethodsInConstructors”)]
公众人士()
{
this.PassportDetails=new HashSet();
}
public int Pk_Person_Id{get;set;}
公共字符串名称{get;set;}
公共字符串EmailId{get;set;}
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2227:CollectionPropertiesShouldBreadOnly”)]
公共虚拟ICollection PassportDetails{get;set;}
}
公共部分类护照详细信息
{
public int Pk_Passport_Id{get;set;}
公共字符串Passport_编号{get;set;}
公共可空Fk_Person_Id{get;set;}
公共虚拟人{get;set;}
}
上下文
public partial class LightCRMEntities : DbContext
{
public LightCRMEntities() : base("name=LightCRMEntities")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public virtual DbSet<PassportDetail> PassportDetails { get; set; }
public virtual DbSet<Person> People { get; set; }
}
public部分类LightCRMEntities:DbContext
{
public LightCRMEntities():base(“name=LightCRMEntities”)
{
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
抛出新代码FirstException();
}
公共虚拟数据库集密码详细信息{get;set;}
公共虚拟数据库集人员{get;set;}
}
嗯,在数据库模型编辑器(.edmx
文件编辑器)中,通过单击关系(实体之间的箭头),您可以以这种方式配置其属性,使其为1:1(不会更改您的数据库!),但随后您可以生成创建此类数据库所需的代码。结果,我得到了以下结果:
-- --------------------------------------------------
-- Creating all tables
-- --------------------------------------------------
-- Creating table 'PassportDetails'
CREATE TABLE [dbo].[PassportDetails] (
[Pk_Passport_Id] int NOT NULL,
[Passport_Number] varchar(255) NULL
);
GO
-- Creating table 'Person'
CREATE TABLE [dbo].[Person] (
[Pk_Person_Id] int IDENTITY(1,1) NOT NULL,
[Name] varchar(255) NULL,
[EmailId] varchar(255) NULL
);
GO
-- --------------------------------------------------
-- Creating all PRIMARY KEY constraints
-- --------------------------------------------------
-- Creating primary key on [Pk_Passport_Id] in table 'PassportDetails'
ALTER TABLE [dbo].[PassportDetails]
ADD CONSTRAINT [PK_PassportDetails]
PRIMARY KEY CLUSTERED ([Pk_Passport_Id] ASC);
GO
-- Creating primary key on [Pk_Person_Id] in table 'Person'
ALTER TABLE [dbo].[Person]
ADD CONSTRAINT [PK_Person]
PRIMARY KEY CLUSTERED ([Pk_Person_Id] ASC);
GO
-- --------------------------------------------------
-- Creating all FOREIGN KEY constraints
-- --------------------------------------------------
-- Creating foreign key on [Pk_Passport_Id] in table 'PassportDetails'
ALTER TABLE [dbo].[PassportDetails]
ADD CONSTRAINT [FK__PassportD__Pk_Pa__5BE2A6F2]
FOREIGN KEY ([Pk_Passport_Id])
REFERENCES [dbo].[Person]
([Pk_Person_Id])
ON DELETE NO ACTION ON UPDATE NO ACTION;
GO
是的,这是因为EF6仅支持1:1。我已将属性更改为1-1,但我收到一个
错误:严重性代码描述项目文件行抑制状态错误运行转换:多重性在关系“FK\uu PassportD\uU FK\u Pe\uu 0B5CAFEA”中的角色“PassportDetails”中无效。因为依赖角色属性不是关键属性,所以依赖角色的多重性上限必须是*
@DmitriyKlyushin好吧,我发布了生成表的代码,删除表并用我的代码重新创建,然后更新模型,应该可以:)谢谢!是的,有帮助。在VisualStudio图表中,现在我看到了关系1-0..1。因此,我得出一个结论,要在Microsoft SQL Server中创建这样的关系,我需要在主键之间建立关系,而不是外键和主键之间的关系。对吗?