通常,在添加带有实体框架的条目时,它知道在身份密钥时忽略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)
答案 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