繁体   English   中英

一对一的值可为空的映射

[英]Mapping for one to one with nullable value

我有两个实体类, ContactUser

UserContactID作为Contact外键。 我可以显示UserContact关系。

现在,我还需要ContactUser的关系,在相同的外键User表(没有Contact

public class Contact{
   public int ContactID {get;set;}
   // This relation doesn't work
   // Need to Make this Work
   public User ContactUser {get;set;}
}

public class User {
   public string Id {get;set;}
   public int? ContactID {get;set;}
   // This Relation works
   [ForeignKey("ContactID")]
   public Contact Contact {get;set;}
}

所以我需要使ContactUser关系在Contact工作。 我应该使用哪种映射?


编辑

正如我建议的那样: modelBuilder.Entity<Contact>().HasRequired(c => c.ContactUser).WithOptional(pi => pi.Contact); 我从User删除了ForeignKey属性,原因是它引起了Multiplicity...error

但是我得到了类似的错误: Invalid column name 'User_Id'.

您正在寻找的是

一对零或一对一映射

StackOverflow上有一个很棒的答案。


在您的情况下,明确要求以下内容:

  • modelBuilder需要WithOptional-Methode

    .WithOptional(pi => pi.Contact);

  • 没有属性的ContactID

EF 6.0示例

public class Contact
{
    [Key]
    public int ContactId { get; set; }

    public string ContactName { get; set; }
    public User ContactUser { get; set; }
}

public class User
{
    [Key]
    public int UserId { get; set; }

    public string UserName { get; set; }
    public Contact Contact { get; set; }
}

在DbContext-Class中:

public class CodeFirstContext : DbContext
{
    public CodeFirstContext()
    {
        Database.SetInitializer(new DropCreateDatabaseIfModelChanges<CodeFirstContext>());            
    }

    public DbSet<Contact> Contacts { get; set; }
    public DbSet<User> Users { get; set; }


    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
          .HasRequired(co => co.Contact)
          .WithOptional(cu => cu.ContactUser);

        base.OnModelCreating(modelBuilder);
    }
}

在这种情况下,现在说“用户的联系人”属性是可选的,而“联系人的用户”属性是必需的。 我希望这是适合您的项目的星座。

控制台测试

class Program
{
    static void Main(string[] args)
    {
        using (var db = new CodeFirstContext())
        {
            Console.Write("Enter a name: ");
            var name = Console.ReadLine();

            var cont = new Contact { ContactName = name };
            db.Contacts.Add(cont);
            db.SaveChanges();

            var usr = new User { UserName = "MyUsername", Contact = cont };
            db.Users.Add(usr);
            db.SaveChanges();

            var query = from b in db.Contacts
                        orderby b.ContactName
                        select b;

            Console.WriteLine("All contacts in the database:");
            foreach (var item in query)
            {
                Console.WriteLine(item.ContactName);
            }

            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
    }
}

尝试这个:

public class Contact
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int ContactId { get; set; }

    public string ContactName { get; set; }
    [ForeignKey("ContactId")]
    public User ContactUser { get; set; }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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