实体框架尝试在添加条目时显式添加ID

时间:2017-04-11 20:46:22

标签: c# entity-framework ef-code-first

通常,在添加带有实体框架的条目时,它知道在身份密钥时忽略ID列。但是,出于某种原因,在向我的Company类添加关系后,每次实体框架尝试添加新的公司条目时,它都会尝试显式添加具有0值的ID并失败。此外,每当我尝试添加任何具有与Company类关系的类的条目时,它都会因违反约束而失败。

这是公司类:

 public int Id { get; set; }
 [Required]
 public string Nombre { get; set; }
 [ForeignKey("Customer")]
 public int CustomerId { get; set; }
 [ForeignKey("CompanyType")]
 public string CompanyTypeCode{ get; set; }
 /* more properties */

public virtual Parameters Parameters { get; set; }

当我将Parameters虚拟属性添加到类时,问题开始出现。这是Parameters类

public int Id { get; set; }
public int CompanyId { get; set; }
/* more stuff */
public virtual Company Company { get; set; }

另外,我必须定义与Fluent API的关系:

modelBuilder.Entity<Company>().HasRequired(e => e.Parameters).WithRequiredDependent(p => p.Company);

这是Entity Framework尝试执行的命令。请注意,它尝试显式添加Id而不是忽略它:

INSERT [dbo].[Company]([Id], [Name], [CustomerId], [Code], [POS], [CompanyCode], [VAT], [Path], [ExpiryDate], [CreatedBy], [CreateDate], [UpdatedBy], [UpdateDate])
VALUES (@0, @1, @2, @3, @4, @5, @6, NULL, NULL, @7, @8, @9, @10)
-- @0: '0' (Type = Int32)
-- @1: 'asdasd' (Type = String, Size = -1)
-- @2: '9' (Type = Int32)
-- @3: '20222222223' (Type = String, Size = -1)
-- @4: '   1' (Type = String, Size = -1)
-- @5: '1' (Type = String, Size = 128)
-- @6: '4' (Type = Int32)
-- @7: '24' (Type = Int32)
-- @8: '11/4/2017 17:46:22' (Type = DateTime2)
-- @9: '24' (Type = Int32)
-- @10: '11/4/2017 17:46:22' (Type = DateTime2)

2 个答案:

答案 0 :(得分:1)

映射......

modelBuilder.Entity<Company>()
    .HasRequired(e => e.Parameters)
    .WithRequiredDependent(p => p.Company);

...已将Company转换为依赖实体,这意味着它不再创建自己的主键,但它等待Parameters获取主键,然后获取该值它自己的主键(同时是一个外键)。

我认为在你的情况下,这种机制在某种程度上受到Parameters.CompanyId的阻碍,因此EF最终为Company.Id插入0。但这并不重要,因为你应该把它转过来:Parameters应该是依赖实体:

modelBuilder.Entity<Company>()
    .HasRequired(e => e.Parameters)
    .WithRequiredPrincipal(p => p.Company);

现在Parameters将有一个主键,它也是一个外键(Company),使Parameters.CompanyId多余。

顺便说一下,为类使用多个名称会令人困惑。

答案 1 :(得分:0)

仅仅因为在创建表“company”时,作为主键的ID字段的属性尚未设置为autoincrement。向表中添加新值是违规,因为ID字段中的值始终为1