Позвольте мне сказать вам, что отношения One-One/Optional не выполняются так. Я использую код, как сделать соотношение 1: 1/0. Также, когда вы используете свободный API, нет необходимости использовать атрибуты Data Annotation. Используйте только один из них, и свободный API лучше, потому что отношения выглядят очень четко.
В соотношении 1: 1/0 внешние ключи не определяются отдельно. Внешний ключ определяется только в одной таблице, а первичный ключ одного объекта становится первичным ключом и внешним ключом другого связанного объекта. В этом примере я сделал поле Id в качестве первичного ключа объекта Person (таблица) и сделал Id как первичный ключ и внешний ключ объекта (таблицы) адреса. Это правильный способ отношения 1: 1/0. Если мы не будем следовать этому соглашению, отношения не будут выполнены должным образом и возникнут проблемы.
Вот код
public class Person
{
// properties
public int Id { get; set; }
public string Name { get; set; }
public virtual Address Address { get; set; }
}
public class Address
{
// properties
public int Id { get; set; }
public string Location { get; set; }
public virtual Person Person { get; set; }
}
public class PersonConfiguration : EntityTypeConfiguration<Person>
{
public PersonConfiguration()
{
ToTable("Person");
HasKey(p => p.Id);
}
}
public class AddressConfiguration : EntityTypeConfiguration<Address>
{
public AddressConfiguration()
{
ToTable("Address");
HasKey(p => p.Id);
Property(a => a.Id).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None);
HasRequired(p => p.Person)
.WithOptional(a => a.Address);
}
}
public class AppObjectContext : DbContext
{
public AppObjectContext() : base("AppConnectionString")
{
}
public DbSet<Person> People { get; set; }
public DbSet<Address> Addresses { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Configurations.Add(new PersonConfiguration());
modelBuilder.Configurations.Add(new AddressConfiguration());
}
}
и здесь результирующая Скриншот
В скриншоте вы можете увидеть, мы можем Accesss экземпляр адреса от Person экземпляра и лица экземпляр из экземпляра Address из-за сопоставленных отношений.
Вот данные, которые я положил в таблицу.
и здесь структура таблицы
Person таблицы SQL Script
CREATE TABLE [dbo].[Person](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](max) NULL,
CONSTRAINT [PK_dbo.Person] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
Адрес Таблица SQL Script
CREATE TABLE [dbo].[Address](
[Id] [int] NOT NULL,
[Location] [nvarchar](max) NULL,
CONSTRAINT [PK_dbo.Address] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE [dbo].[Address] WITH CHECK ADD CONSTRAINT [FK_dbo.Address_dbo.Person_Id] FOREIGN KEY([Id])
REFERENCES [dbo].[Person] ([Id])
GO
ALTER TABLE [dbo].[Address] CHECK CONSTRAINT [FK_dbo.Address_dbo.Person_Id]
GO
В ответ на ваш Примечание:
Я хотел бы отметить, что мне нужно идентификаторы FK доступны на обоих лиц, определенных выше.
Это противоречит соглашению о соотношении 1: 1/0, но лучший способ заключается в следующем.
В отношениях друг к другу значения внешнего ключа и первичных ключей одинаковы, это означает, что если вы получаете доступ к объекту первичного ключа одного объекта, это внешний ключ и первичный ключ другого объекта.
Например, если первичный ключ человека равен 20, то внешний ключ и первичный ключ адреса, сопоставленного с этим человеком, также равны 20. Это правильный способ доступа.
Использовать свободно или аннотации. Код выглядит хорошо. Должно сработать. – vijayst