Entity framework 实体框架1:0或1关系
我有以下型号:Entity framework 实体框架1:0或1关系,entity-framework,ef-fluent-api,Entity Framework,Ef Fluent Api,我有以下型号: public class User { public int Id { get; set; } public Customer Customer { get; set; } ... } public class Customer { public int Id { get; set; } public int UserId { get; set; } public User User { get; set; } ... }
public class User
{
public int Id { get; set; }
public Customer Customer { get; set; }
...
}
public class Customer
{
public int Id { get; set; }
public int UserId { get; set; }
public User User { get; set; }
...
}
我想要的是客户
必须有用户
,但只能有一个,用户
不必有客户
我想用Fluent API来实现这一点,但我无法使它正常工作,以便
客户
和用户
都将其Id
属性设置为标识字段。当您配置一对一关系时,实体框架要求依赖项的主键也是外键,在您的情况下,它将是:
public class User
{
public int Id { get; set; }
public virtual Customer Customer { get; set; }
...
}
public class Customer
{
[Key, ForeignKey("User")]
public int UserId { get; set; }
public virtual User User { get; set; }
...
}
modelbuilder.Entity<Customer>().HasRequired(c=>c.User).WithOptional(u=>u.Customer);
但是您希望每个实体都有自己的PK,所以EF允许您这样做,但是您应该从Customer
实体中删除UserId
属性,因为正如我前面所说的,在这种关系中,FK也必须是PK。要正确配置您的关系,请使用@Claies在其评论中建议您使用的Required
数据注释:
public class User
{
public int Id { get; set; }
public virtual Customer Customer { get; set; }
...
}
public class Customer
{
[Key]
public int Id { get; set; }
[Required]
public virtual User User { get; set; }
...
}
或者您可以使用Fluent Api,配置如下:
public class User
{
public int Id { get; set; }
public virtual Customer Customer { get; set; }
...
}
public class Customer
{
[Key, ForeignKey("User")]
public int UserId { get; set; }
public virtual User User { get; set; }
...
}
modelbuilder.Entity<Customer>().HasRequired(c=>c.User).WithOptional(u=>u.Customer);
或者您可以使用Fluent Api:
modelbuilder.Entity<Customer>().HasKey(t => t.Id)
.Property(t => t.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
恐怕您的错误是由于您的数据库模式造成的。
Customers
表上的Id
也必须是FK。该错误意味着您的实体之间存在某种关系,其中依赖实体中的外键属性定义为store generated,这是因为您正在尝试将客户实体的Id更改为Identity
,这在您的数据库中是FK。您不需要fluent api,您只需要添加导航属性,这里没有显示这些属性。@Claies-那么它现在应该是这样的吗?没有流畅的配置?你的标题是1:1,但你的描述是1:0.1(1User
到0或1Customer
),如果没有定义流畅的配置,我会得到以下错误<代码>无法确定类型“ArtImpressions.Core.Domain.Model.User”和“ArtImpressions.Core.Domain.Model.Customer”之间关联的主端。必须使用关系fluent API或数据批注显式配置此关联的主端。@Claies-这是正确的。我将更新标题。谢谢!在上面的步骤之后,我仍然得到一个迁移,它没有将Customer.Id
设置为标识。ReferentialConstraint中的依赖属性映射到存储生成的列。列:“Id”。当我执行更新1所说的操作时。@山姆,检查更新2