Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 实体框架1:0或1关系_Entity Framework_Ef Fluent Api - Fatal编程技术网

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(1
User
到0或1
Customer
),如果没有定义流畅的配置,我会得到以下错误<代码>无法确定类型“ArtImpressions.Core.Domain.Model.User”和“ArtImpressions.Core.Domain.Model.Customer”之间关联的主端。必须使用关系fluent API或数据批注显式配置此关联的主端。@Claies-这是正确的。我将更新标题。谢谢!在上面的步骤之后,我仍然得到一个迁移,它没有将
Customer.Id
设置为标识。ReferentialConstraint中的依赖属性映射到存储生成的列。列:“Id”。当我执行更新1所说的操作时。@山姆,检查更新2