简体   繁体   中英

One-to-one relationship in Entity Framework code-first

I am using C# EF code-first. I have the following 2 classes:

public class Om_Currency
{
    [Key]
    public Int16 CurrencyID { get; set; }
    public String CurrencySymbol { get; set; }
    public Boolean IsActive { get; set; }

    public Int32 CountryID { get; set; }

    public virtual Om_Country Country { get; set; }
}

public class Om_Country
{
    [Key]
    public Int16 CountryID { get; set; }
    public String CountryName { get; set; }
    public Boolean IsActive { get; set; }

    public Int32 CurrencyID { get; set; }

    public virtual Om_Currency Currency { get; set; }
}

Now, I am trying to implement an 1-1 relationship between these 2 classes. So that I can get Currency details from Country and Country details can be fetched from Currency .

 modelBuilder
        .Entity<Om_Country>()
        .HasOptional(f => f.Currency)
        .WithRequired(s => s.Country);

 modelBuilder
        .Entity<Om_Currency>()
        .HasOptional(f => f.Country)
        .WithRequired(s => s.Currency);

But I get this error:

The navigation property 'Country' declared on type 'ObjectModel.Country.Om_Currency' has been configured with conflicting multiplicities.

Am I doing something wrong?

This is the mapping class for Country :

public class CountryMap : EntityTypeConfiguration<Om_Country>
{
    public CountryMap()
    {
        Property(x => x.CountryID)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        Property(x => x.CountryName)
            .IsRequired()
            .HasMaxLength(100)
            .HasColumnAnnotation
            (
                IndexAnnotation.AnnotationName,
                new IndexAnnotation
                    (
                        new IndexAttribute("U_CountryName", 1) { IsUnique = true }
                    )
           );
        Property(x => x.IsActive).IsRequired();
        Property(x => x.CurrencyID).IsRequired();
        ToTable(clsCommon.tblCountry);
    }
}

and this is the mapping class for Currency :

public class CurrencyMap : EntityTypeConfiguration<Om_Currency>
{
    public CurrencyMap()
    {
        Property(x => x.CurrencyID)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        Property(x => x.CurrencySymbol)
            .IsRequired()
            .IsVariableLength()
            .HasMaxLength(50)
            .HasColumnAnnotation
            (
                IndexAnnotation.AnnotationName,
                new IndexAnnotation
                    (
                        new IndexAttribute("U_CurrencySymbol", 1) { IsUnique = true }
                    )
            );

        Property(x => x.IsActive).IsRequired();
        Property(x => x.CountryID).IsRequired();
        ToTable(clsCommon.tblCurrency);
    }
}

I figured out the issue. I got the Solution from here

Instead of below

modelBuilder
    .Entity<Om_Country>()
    .HasOptional(f => f.Currency)
    .WithRequired(s => s.Country);

modelBuilder
    .Entity<Om_Currency>()
    .HasOptional(f => f.Country)
    .WithRequired(s => s.Currency);

It should be below

modelBuilder.Entity<Om_Country>()
    .HasRequired(x => x.Currency).WithMany()
    .HasForeignKey(x => x.CurrencyID).WillCascadeOnDelete(false);

modelBuilder.Entity<Om_Currency>()
    .HasRequired(x => x.Country).WithMany()
    .HasForeignKey(x => x.CountryID).WillCascadeOnDelete(false);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM