2015-05-16 2 views
2

Я пытаюсь использовать провайдер типа SqlDataConnection в F # для доступа к базе данных, которую я создал, с использованием первой модели сущности Framework, определенной на C#.Поставщики SQL-типов не работают правильно для многих-многих отношений.

public class Tag 
{ 
    [Required] 
    public int TagId { get; set; } 
    [Required] 
    public string Name { get; set; } 

    public virtual ICollection<Bookmark> TagBMs { get; set; } 

    public Tag() 
    { 
     TagBMs = new HashSet<Bookmark>(); 
    } 
} 

public class Bookmark 
{ 
    [Required] 
    public int BookmarkId { get; set; } 
    [Required] 
    public string Url { get; set; } 
    [Required] 
    public DateTime DateAdded { get; set; } 

    public virtual ICollection<Tag> BMTags { get; set; } 

    public Bookmark() 
    { 
     BMTags = new HashSet<Tag>(); 
    } 
} 

public class BookmarksContext : DbContext 
{ 
    protected override void OnModelCreating(DbModelBuilder builder) 
    { 
     builder.Entity<Bookmark>().HasMany(b => b.BMTags).WithMany(t => t.TagBMs).Map(cs => 
      { 
       cs.MapLeftKey("TagId"); 
       cs.MapRightKey("BookmarkId"); 
       cs.ToTable("BookmarkTag"); 
      }); 

     base.OnModelCreating(builder); 
    } 

    public DbSet<Bookmark> Bookmarks { get; set; } 
    public DbSet<Tag> Tags { get; set; } 
} 

При доступе к базе данных в C#, объекты Tag имеют свойство «TagBMs», и закладки имеют свойство «BMTags», который можно использовать для добавления тегов в закладки и закладки в тегах. Однако, когда я пытаюсь получить доступ к одной базе данных из F #, эти свойства не отображаются. Вместо этого объекты Bookmark имеют свойство «BookmarkTag», которое возвращает данные из таблицы ссылок. Что мне нужно изменить, чтобы получить правильные свойства в F #? Я создал тип SqlDataConnection следующим образом:

type dbSchema = SqlDataConnection<"""Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=DatabaseModelAndMigrations.BookmarksContext;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False"""> 
+0

Почему вы не используете свой C# EF DbContext в коде F #? Было бы намного проще и проще. –

+0

Спасибо Fyodor, я попробовал ваше предложение и с помощью контекста C# db в коде f #, и я могу использовать свойства, и многие из многих отношений работают правильно. Одна небольшая проблема с этим подходом заключалась в том, что, похоже, нет возможности легко отбросить все данные из таблицы, как это было с провайдером типа F # (я делаю это в своем тестировании интеграции), но я работал над этим, выполняя SQL «удалить из ...» напрямую. Если вы хотите рекламировать свой комментарий к ответу, я соглашусь с ним. –

ответ

0

Не использовать поставщик типа SQL, просто использовать C# EF DbContext с ваших F # код.

Было бы намного проще и проще.

Смежные вопросы